【问题标题】:PHP: Unexpected behavior: foreach... {$array['country'][] = $value['country']}PHP:意外行为:foreach... {$array['country'][] = $value['country']}
【发布时间】:2011-08-25 13:45:37
【问题描述】:

为什么要运营商

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

如果我只是愚蠢,请告诉我......我真的无法理解为什么会这样。

【问题讨论】:

  • 在进入foreach之前你在$data有什么?即 var_dump($data) 是什么样的?
  • 我现在离开了我的 Linux 机器,但这只是一个基本的 while($row=mysql_fetch_assoc($result)){$data[]=$row;}
  • 另外,你为什么将$result定义为一个空数组,但是,你在其余的代码中没有触及它?
  • 我想我认为我正在做的让事情变得简单的是定义一个数组,稍后我可以在 while 循环之外使用它。它似乎有效,只是有一些自相矛盾的行为。
  • 所以 $data 中的每个元素本身都是一个关联数组,您正试图将其转置到另一个数组,其中列名是键并且每个元素都保存该列的值?我不明白那是什么问题。

标签: php mysql arrays multidimensional-array


【解决方案1】:
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++
    }

【讨论】:

    【解决方案2】:

    为什么要运营商

    $array['country'][]

    返回什么 从逻辑上讲是 $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++;
    }
    

    【讨论】:

    • 我认为只是我对 PHP 如何处理嵌套数组的理解很差,这让我很困惑。谢谢你给我看。这让我明白了如何命名键:while ($row = mysql_fetch_array($result)) { $array['report'][$i." ".$row['country']] = $row['report']; $array['report'][$i." ".$row['region']] = $row['report']; $i++; } print_r($array);
    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      相关资源
      最近更新 更多