【问题标题】:Multidimensional array loop to get value多维数组循环获取值
【发布时间】:2017-09-05 14:45:41
【问题描述】:

我有一个由多个数组组成的数组,它们都具有不同的级别。我试图做的是按键循环遍历数组,它将遍历每个级别获取这些键的值。 myArray 看起来像这样

Array ( [0] => 
  Array ( [Date] => 2011-15-22 
          [Color] => blue
          [Status] => Fresh 
        [1] => 
  Array ( [Date] => 1999-08-04 
          [Color] => green
          [Status] => Rotten) )

我试过了

foreach($myArray as $row){
  foreach($row["Date"] as $k){
     echo $k
    } 
 }

我收到了

Notice: Undefined index: Date 

Warning: Invalid argument supplied for foreach() 

【问题讨论】:

  • 您是否收到这些错误?您确定所有元素的数组结构都完全相同吗(认为您有超过 2 个项目)
  • $row["Date"] 是一个字符串,foreach 不会抱怨什么。
  • 只要echo $row["Date"] - 如果你只想要日期,就不需要嵌套的foreach。
  • @Calimero 是的,所有数组的结构都相同
  • Make a unique list of values from a particular key existing anywhere in a deep array 的可能重复项...当然,如果您愿意,可以省略删除重复项的最后一步。

标签: php arrays multidimensional-array


【解决方案1】:

只需array_walk_recursive函数:

$arr = [
    [ 'Date' => '2011-15-22', 'Color' => 'blue', 'Status' => 'Fresh' ],
    [ 'Date' => '1999-08-04', 'Color' => 'green', 'Status' => 'Rotten' ]
];

array_walk_recursive($arr, function($v, $k){
    if ($k == 'Date') echo $v . PHP_EOL;
});

输出:

2011-15-22
1999-08-04

【讨论】:

    【解决方案2】:

    在您的 foreach 中,您应该指定键和值,以便您可以同时访问:

    foreach ($myArray as $key => $value){
        echo $key.' is '. gettype ($value).'<br>';
        if (is_array($value)){
            foreach ($value as $subKey => $subValue){
                echo $subkey . ' => ' . $subValue . '<br>';
            }
        }
    }
    

    这样您可以访问和打印所有值而不会丢失结构

    【讨论】:

      【解决方案3】:

      作为 cmets 中的 axiac 状态,$row["Date"] 是一个字符串,因此不可迭代。你可能只是想要这个:

      foreach($myArray as $row){
        foreach($row as $k){
           echo $k
          } 
       }
      

      通知Undefined index: Date 还描述了问题所在 - 您正在访问索引而不检查它是否存在。看起来您的数据结构并不总是相同的。在这种情况下,您应该始终使用 isset 函数检查是否存在:

      if (isset($row["Date"])) {
          //do something here
      }
      

      【讨论】:

      • 我如何在日期使用 isset。日期作为字符串返回。
      • isset 只做一件事:它告诉你变量是否为null(默认情况下每个变量都是)。你在那儿传递什么都没关系。
      • 在添加 if isset 语句后打印 foreach 的结果不返回任何内容。但是如果我动态返回 myArray[0]["Date"] 它将返回内容
      【解决方案4】:

      看起来你只需要这个:

      foreach($myArray as $row){
        echo $row["Date"]; 
       }
      

      foreach($myArray as $row){
        $k= $row["Date"]; 
        //do stuff...
       }
      

      foreach($myArray as $row){
        $k[]= $row["Date"]; 
       }
      // do stuff with $k[] array.
      

      【讨论】:

      • 我收到日期未定义的索引错误。有什么我想念的吗。日期是一个字符串
      • @jumpman8947 如果所有数组的结构都与您显示的相同,则不应收到该警告。
      【解决方案5】:

      警告:为 foreach() 提供的参数无效

      因为$row["Date"]是字符串

      foreach() - foreach 仅适用于数组和对象,当您尝试在具有不同数据类型的变量或未初始化的变量上使用它时会发出错误。

      注意:未定义索引:日期

      可能您的数组可能在某处没有带有键 Date 的元素(您的数组结构可能不同,因为迭代发生),所以您收到此消息,使用 isset()array_key_exists() 进行验证,具体取决于目的。

      请注意isset != array_key_exists

      $a = array('key1' => 'test1', 'key2' => null);
      isset($a['key2']);             // false
      array_key_exists('key2', $a);  // true
      

      还有一个重要的区别。当$a 不存在时isset 不会抱怨,而array_key_exists 会抱怨。

      【讨论】:

      • 我摆脱了第二个 foreach 但我得到了未定义的索引错误。日期是一个字符串我该如何解决这个错误
      • 在添加 if isset 语句后打印 foreach 的结果不返回任何内容。但是如果我动态返回 myArray[0]["Date"] 它将返回内容
      • isset 或 array_key_exists 用于在需要时进行验证,如果您的数组与上面相同,则 foreach($myArray as $row){ echo $row['Date']; } 应该可以工作
      • 我的数组结构与上面发布的一样,但我仍然得到未定义的索引:日期错误
      猜你喜欢
      • 2013-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 2016-01-19
      • 1970-01-01
      相关资源
      最近更新 更多