【问题标题】:Combine arrays in PHP在 PHP 中合并数组
【发布时间】:2011-01-24 00:19:05
【问题描述】:

尝试学习 PHP 中的数组。为简洁起见,张贴了片段。

此处为 HTML 表单:

<p>What are your favorite type of cookies?</p> 
<input type="checkbox" name="cookies[]" value="Oreos" />Oreos<br />
<input type="checkbox" name="cookies[]" value="Chocolate chip" />Chocolate chip<br />
<input type="checkbox" name="cookies[]" value="Sugar" />Sugar<br />
<input type="checkbox" name="cookies[]" value="Vanilla Mocha" />Vanilla Mocha<br /> 

<p>What are your favorite type of drinks?</p>
<input type="checkbox" name="drinks[]" value="Soda" />Soda<br />
<input type="checkbox" name="drinks[]" value="Wine" />Wine<br />
<input type="checkbox" name="drinks[]" value="Milk" />Milk<br />
<input type="checkbox" name="drinks[]" value="Water" />Water<br /> 

PHP 页面在这里:

foreach ($drinks as $d) {
    echo "Your favorite drink(s) are: " . $d . "<br />"; 
}

foreach ($cookies as $cookie) {
    echo "Your favorite cookies are: " . $cookie . "<br />"; 
} 

$experimentalArray = array($cookie => $d); 

foreach ($experimentalArray as $key => $value) { 
    echo "Cookie - " . $key . " Drink - " . $value . "<br /><br />"; 
} 

饼干和饮料都是多选题,因此您可以选择多个答案。

但是,experimentalArray 仅显示在饮料和饼干问题中选择的最后一个答案。

例如,我在饼干中选择奥利奥和巧克力片,在饮料中选择苏打水和葡萄酒。

答案是:“饼干 - 巧克力片饮料 - 酒”

为什么不显示所有值?

为多维脚本编辑

<?php 

$drinks = $_POST['drinks']; 
$cookies = $_POST['cookies']; 

    $combinedArray = array( 'Cookies' => $cookies, 'Drinks' => $drinks); 

    foreach($combinedArray as $snackType => $snack) {
    print "<h2>$snackType</h2>";
    foreach ($snack as $number => $snackChosen) {
        print " $number is $snackChosen<br />";
    }

} ?>

好的,因此尝试执行多维数组脚本,因为之前的脚本不会按照 HTML 表单获取所有值。

此脚本有效(从一本书中摘录并在此处针对此代码进行了修改),但是,$number 值从 0 开始。如何修改它以使其从 1 开始?

另外,这是做多维数组的正确形式吗?它可以以更好的方式重写吗?

再次感谢您的所有回复。即使我不太了解他们! :) 所以,也感谢您的耐心等待。

【问题讨论】:

  • 专业提示:print_r($_POST);。另外,请告诉我您关闭了register_globals,您只是在为 $_POST 数组设置别名。
  • 是的,全局寄存器已关闭。是的,别名 $_POST 数组,如果你的意思是我在 php 页面中“重命名”它。正如我在下面对 ThiefMaster 的评论中发布的那样: $drinks = $_POST['drinks']; $cookies = $_POST['cookies'];

标签: php html


【解决方案1】:

不知道你用的是哪个 php 教程,但别再用了,它可能已经过时了!

您必须使用 $_POST / $_GET / $_REQUEST(包含 POST、GET 和 - 取决于配置 - Cookie 值)数组。 register_globals 已弃用,如果启用,则可能存在安全漏洞。

例如,使用 $drinks = isset($_POST['drinks']) ? $_POST['drinks'] : array(); 获取您的 $drinks 数组。 $cookies 也一样。


关于您的阵列问题。看起来您想要饮料数组中的键和 hte cookies 数组中的值。如果是,请查看array_combine()。请注意,它要求两个数组具有相同数量的元素,因此向其提供长度可以变化的用户生成数组并不是一个好主意。

仅供参考,$experimentalArray = array($cookie =&gt; $d); 将 $cookies 的最后一个元素映射到 $drinks 的最后一个元素,因为 PHP 没有块范围,因此 $cookie 和 $d 仍然指向您在 foreach 循环中获得的最后一个数组元素。

【讨论】:

  • 嗯,我正在使用 $_POST 来获取值。抱歉,只发布了我认为与问题相关的部分。没有说不清楚的意思。这是我的 $_POST 东西:$drinks = $_POST['drinks']; $cookies = $_POST['cookies'];
  • 是的,很明显,如果他得到任何东西,他必须将 $_POST['drinks'] 和 $_POST['cookies'] 转换为另一个变量或直接使用它们。
  • 哎呀。对不起,不是试图让它不清楚。认为很明显,如果我问为什么它只显示我在某处使用 $_POST 选择的最后一个值。我对这一切真的很陌生。无论如何,关于为什么它只显示最后一个值的任何答案?我的问题清楚吗?哇,人们在这里回答得很快吗!
  • 现在你知道了不要省略重要的代码部分,至少要提到你省略了它们。 ;) 关于“最后的价值观”问题:见我回答的最后一段。哦,也许将您的 SO 昵称从“user567665”更改为真实的东西。默认的刻痕让人们看起来很愚蠢 IMO。
  • 如果 $drinks 和 $cookies 数组不包含任何内容,脚本如何输出任何值? +1 的想法虽然,这是我的第一个想法
【解决方案2】:

这里有一些问题。

  1. 当您使用 foreach 进行迭代并希望对每个元素执行操作时,代码需要位于 foreach 的小括号之间。
  2. 用户总是有可能选择与饮料不同数量的饼干,这会导致问题,因为一个食物不会有一对。

我建议的解决方案是 array_combine() 函数,在将每个数组填充到相同长度后将 cookie 与饮料配对:

<?php
//$cookies = array_pad( $cookies , count( $drinks ), '(none)' ); Doesn't work, thanks for pointing this out @Phoenix
$drinks = array_pad( $drinks, count( $cookies ), '(none)' ); //If more cookies than drinks, add (none) drinks to account for extra cookies
$combined = array_combine( $cookies, $drinks ); //Combine arrays and cookies
?>

当然,这可能看起来有点复杂,所以让我解释一下。假设用户选择了加牛奶和水的糖和巧克力曲奇。这些显然不是最美味的选择,但在这种情况下它们是最佳选择。由于 cookie 的数量与饮料的数量相同,PHP 将简单地将选项与 array_combine() 函数配对。此函数接受一组键 (cookie) 和值 ($drinks) 并将它们组合成一个。例如。

array_combine( array( 'one', 'two' ), array( 1, 2 ) ) == array( 'one' => 1, 'two' => 2 );

当用户选择不相等数量的喜爱零食时,我们会遇到问题。这是前两行开始发挥作用的时候。第一行将为每个额外的饮料添加 (none) 到 cookie 数组。例如。

array_pad( array( 'one' ), 2, '(none)' ) == array( 'one', '(none)' );

下一行做同样的事情,但等于饮料和饼干(在这种情况下,选择的饼干多于饮料)。

如果您需要更多示例,请告诉我。

【讨论】:

  • 这是另一种可能适当填充 $cookies 的方法:if(count($drinks)&gt;count($cookies)){ for($i=1;$i&lt;=count($drinks);$i++){ if(!isset($cookies[$i])){ $cookies[$i] == 'None ' . $i;}}}
  • @Phoenix 很好的例子(虽然我更喜欢 foreach)。我一直在寻找一种方法,这样输出就不会被一堆零污染。我想最简单的方法是对 (None[0-9]*) 进行正则表达式并将其替换为 (No Choice) 或更用户友好的东西。现在我想了想,最好的方法是建立饼干和饮料对,并且只显示饼干和饮料都被选中的对。
  • 嗯,很有趣。当我试图回应你的 $combined 时,它给了我“数组”。如果我似乎没有得到它,请原谅我。这对我来说真的很新鲜。
  • @user567665 回显数组应输出“Array”。要查看数组的内容,请使用print_r()。前任。 print_r( array( 1, 2, 3 ) );
  • 嘿,如果您在两个问题上选择相同数量的答案,它会起作用。如果不相等,就会有点不稳定。嗯。这里的所有答案有点,好吧好吧,在我头上。需要一点时间来思考这一切。不过谢谢大家。非常感谢您花时间回答我的问题。
【解决方案3】:

前两个呢?他们工作得当吗?我相信问题出在这里:

$experimentalArray = array($cookie => $d);

应该是这样的

$experimentalArray = array($cookies => $drinks);

虽然我不认为我曾经以这种方式创建过数组,但不确定 $cookies 的值是否会自动成为 $drinks 的键。

如果不是,生成这样一个数组的方法如下:

if(count($drinks) >= count($cookies))
{
     $count = count($drinks);
}
else
{
     $count = count($cookies);
}

for($i=1;$i<=$count;$i++)
{
     if(isset($drinks[$i]) && isset($cookies[$i]))
     {
          $experimentalArray[$cookies[$i]] = $drinks[$i];
     }
     else if(isset($drinks[$i]) && !isset($cookies[$i]))
     {
          $experimentalArray['None' . $i] = $drinks[$i];
     }
     else
     {
          $experimentalArray[$cookies[$i]] = 'None' . $i;
     }
}   

或者类似的东西,这说明选择的一种类型是否比另一种少。

【讨论】:

  • 现在试过了。它不起作用。什么都没有出现。是的,前两个作品。这是它的代码。 foreach ($drinks as $d) { echo "你最喜欢的饮料是:" . $d 。 "
    "; } foreach ($cookies as $cookie) { echo "你最喜欢的 cookie 是:" . $cookie 。 "
    "; }
  • 刚刚修改过的帖子。但我相信有一个内置函数可以将两个数组组合为 value=>value,但我从来没有真正用过它,而且我不确定如果一个数组的值比另一个数组少它会如何反应。
  • @Phoenix 你在想array_combine()。 “如果每个数组的元素数量不相等,则返回 ... FALSE”
  • 啊,是的,上面是 PhpMyCoder,array_combine。当然,如果一个比另一个多两个或更多,你最终会得到一个多维数组,因为使用他发布的内容,你会得到两个或更多$experimentalArray['(none)'],好吧,当且仅当喝酒超过 cookie 两个或更多。
  • 这就是为什么你必须先array_padarray_combine 他们。 (见我的回答)
【解决方案4】:
This script works (was ripped off from a book and modified for this code here), however, $number value starts at 0. How do I modify that so that it starts at 1 instead?

PHP 总是从 0 开始计数。 您可以在以下位置阅读更多相关信息: http://php.net/manual/de/language.types.array.php

【讨论】:

    猜你喜欢
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    相关资源
    最近更新 更多