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

时间:2011-05-14 16:07:57

标签: php mysql arrays multidimensional-array

为什么是运营商

$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;

让我知道,如果我只是愚蠢......我无法理解为什么这样做。

3 个答案:

答案 0 :(得分:2)

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++
    }

答案 1 :(得分:1)

  

为什么是运营商

     

$ array ['country'] []

     

返回什么   从逻辑上讲   $阵列[] [ '国家']

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

如果使用$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++;
}

答案 2 :(得分:1)

假设$data是由你使用循环构建的,就像你在评论中粘贴的那样(while($row=mysql_fetch_assoc($result)){$data[]=$row;})那么我的答案就是因为这正是你要求PHP做的。

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

所以你正在用循环做的是构建一个数组,其键是从0开始的数字并递增(每个循环+1,这是[]效果)并使用这些键来获取你正在获得的行关闭数据库结果集。

如果您想以您描述的方式访问$data,则必须更改构建方式。请参阅Lawrence Cherone's answer