PHP:意外行为:foreach.{$array['国家'][] = $value['国家']}.


PHP: Unexpected behavior: foreach... {$array['country'][] = $value['country']}

为什么运算符

$array['country'][]返回逻辑上会$array[]['country']

我要说的是这个。如果要从 MySQL 数组中提取,则每行的 ['country'] 值为 [1],[2]...[n],你必须使用

$array['country'][]

尽管它们被排序为

$array['row#']['country']

这是因为 PHP 向后读取某些内容,还是因为我只是缺少一些基本的数组信息?

完整的代码在这里

$result = array();
foreach($data as $value){
   $array['country'][] = $value['country'];
   $array['report'][] = $value['report'];
}
$data = $array;

让我知道我是否只是愚蠢...我真的无法理解为什么这是这样工作的。

get an id from the db
    SELECT id,country,report from yourdb
    while ($row = mysql_fetch_array($result)) {
     $array['country'][$row['id']] = $row['country'];
     $array['report'][$row['id']] = $row['report'];
    }

create an id
    SELECT country,report from yourdb
    $i=0
    while ($row = mysql_fetch_array($result)) {
     $array['country'][$i] = $row['country'];
     $array['report'][$i] = $row['report'];
    $i++
    }

为什么运营商

$array["国家"][]

返回什么 从逻辑上讲将是 $array[]["国家"]?

这是因为以这种方式构造数组:

如果使用 $array['country'][] = $value['country']; ,则会向子数组添加一个新值,该子数组是 country 键下包含数组的一部分。所以它将被映射到 $array['country'][] ,否则你不能指望。

如果您希望映射到 array[]['country'] ,则(使用来自@Lawrence的答案),您必须使用显式数字索引作为键添加新值:

SELECT country,report from yourdb
$i=0;
while ($row = mysql_fetch_array($result)) {
  $array[$i]['country'][] = $row['country'];
  $array[$i]['report'][] = $row['report'];
  $i++;
}

假设$data是由您使用类似于您粘贴在注释中的循环构建的(while($row=mysql_fetch_assoc($result)){$data[]=$row;}),那么我的答案将是因为这正是您要求PHP做的。

$data[] = some-value-here这个概念意味着获取该值并将其添加到$data数组的末尾,并带有自动生成的键,我只是不在乎。也就是说,PHP 基本上会看到最后一项的键是什么,添加 1 并将其用作要添加到数组中的项的键。

因此,您正在对该循环所做的是构建一个数组,其键是从 0 开始并递增的数字(+1 每个循环,这是[]效果),并将这些键用于您从数据库结果集中获取的行。

如果你想以你描述的方式访问$data,那么你必须改变你构建它的方式。参见劳伦斯·切罗内(Lawrence Cherone)的答案。