【问题标题】:Find all second level keys in multi-dimensional array in php在php中查找多维数组中的所有二级键
【发布时间】:2010-11-30 03:46:14
【问题描述】:

我想生成使用的第二级键的列表。每条记录不包含所有相同的键。但我需要知道所有的键是什么。 array_keys() 不起作用,它只返回一个数字列表。

基本上我正在寻找的输出是:

action、id、validate、Base、Ebase、Ftype、Qty、Type、Label、Unit

我有一个遵循以下格式的大型多维数组:

Array
(
    [0] => Array
        (
            [action] => A
            [id] => 1
            [validate] => yes
            [Base] => Array
                (
                    [id] => 2945
                )

            [EBase] => Array
                (
                    [id] => 398
                )

            [Qty] => 1
            [Type] => Array
                (
                    [id] => 12027
                )

            [Label] => asfhjaflksdkfhalsdfasdfasdf
            [Unit] => asdfas
        )

    [1] => Array
        (
            [action] => A
            [id] => 2
            [validate] => yes
            [Base] => Array
                (
                    [id] => 1986
                )

            [FType] => Array
                (
                    [id] => 6
                )

            [Qty] => 1
            [Type] => Array
                (
                    [id] => 13835
                )

            [Label] => asdssdasasdf
            [Unit] => asdger
        )
)

感谢您的帮助!

【问题讨论】:

    标签: php arrays multidimensional-array key


    【解决方案1】:
    foreach($bigArray as $array){    
        foreach($array as $key=>$value){
            echo $key;
        }
    }
    

    这应该可以满足您的需求。

    【讨论】:

    • 感谢 inkedmn - 我第一次尝试了你的第一个版本(在你编辑之前),它显然没有用。这个工作得很好,然后是一个简单的 if 语句来检查重复项,我就有了我的数据。
    • 这一款也非常适合我的需求。我试图获得看起来 ``` [applications] => Array ( [0] => Array ( [id] => 2 [name] => WordPress [short_name] => wordpress [deploy_name] => Ubuntu 18.04 x64 上的 WordPress ``` 这让我得到了 id 和 name 作为 key => values ``` foreach ($apps as $app) { foreach ($app as $key=>$value) { $vultr_apps_nice[ $value['id']] = $value['name']; } } ```
    【解决方案2】:

    这样的事情怎么样:

    $your_keys = array_keys($your_array[0]);
    

    当然,这是考虑到所有子数组都有相同的键;在这种情况下,您只需要第一个子数组的键(我猜不需要遍历所有第一级子数组)


    而且,作为一个缩短/简化的例子:

    $your_array = array(
        array(
            'action' => 'A',
            'id' => 1,
            'base' => array('id' => 145),
        ),
        array(
            'action' => 'B',
            'id' => 2,
            'base' => array('id' => 145),
        ),
        array(
            'action' => 'C',
            'id' => 3,
            'base' => array('id' => 145),
        )
    );
    
    $your_keys = array_keys($your_array[0]);
    var_dump($your_keys);
    

    会得到你:

    array
      0 => string 'action' (length=6)
      1 => string 'id' (length=2)
      2 => string 'base' (length=4)
    

    您可以使用implode 来获取您要求的字符串:

    echo implode(', ', $your_keys);
    

    会得到你:

    action, id, base
    

    即,第一个子数组的键列表。

    【讨论】:

    • 感谢 Pascal,不幸的是每个数组不包含相同的键。
    • 嗬,太糟糕了:-(在这种情况下,如何在每个子数组上使用array_keys,然后在这些子数组的键列表上使用array_merge?
    【解决方案3】:
    array_keys(call_user_func_array('array_merge', $a));
    

    合并所有值并检索结果键。

    【讨论】:

    【解决方案4】:
    <?php
    
    // Gets a list of all the 2nd-level keys in the array
    function getL2Keys($array)
    {
        $result = array();
        foreach($array as $sub) {
            $result = array_merge($result, $sub);
        }        
        return array_keys($result);
    }
    
    ?>
    

    编辑:删除了多余的 array_reverse() 函数

    【讨论】:

    • 效果很好,无需检查重复键的值!
    • 为什么打电话给array_reverse()
    • @gunderwonder - 它将键转换为值 - 这样 array_merge() 会将所有键合并在一起
    • array_merge() 合并数组之间共享的任何非数字键,array_reverse() 只是颠倒键的顺序。没有array_reverse(),你的函数也能正常工作
    • 工作就像一个魅力。很好,干净,也很简单。
    【解决方案5】:
    function  __getAll2Keys($array_val){
            $result = array();
            $firstKeys = array_keys($array_val);
            for($i=0;$i<count($firstKeys);$i++){
                $key = $firstKeys[$i];
                $result = array_merge($result,array_keys($array_val[$key]));
            }
            return $result;
        }
    

    试试这个功能。它会如你所愿返回。

    【讨论】:

      【解决方案6】:

      也许您可以使用 array_map 函数,它可以让您避免数组迭代并返回一个包含您需要的键作为值的数组。

      会是这样的

      $newArray = array_map(function($value){return array_keys($value);},$yourArray);
      
      var_dump($newArray);
      
      array (size=2)
        0 => 
          array (size=9)
            0 => string 'action' (length=6)
            1 => string 'id' (length=2)
            2 => string 'validate' (length=8)
            3 => string 'Base' (length=4)
            4 => string 'EBase' (length=5)
            5 => string 'Qty' (length=3)
            6 => string 'Type' (length=4)
            7 => string 'Label' (length=5)
            8 => string 'Unit' (length=4)
        1 => 
          array (size=9)
            0 => string 'action' (length=6)
            1 => string 'id' (length=2)
            2 => string 'validate' (length=8)
            3 => string 'Base' (length=4)
            4 => string 'FType' (length=5)
            5 => string 'Qty' (length=3)
            6 => string 'Type' (length=4)
            7 => string 'Label' (length=5)
            8 => string 'Unit' (length=4)
      

      【讨论】:

      • 只是将键切换为值
      【解决方案7】:

      一个班轮:

      $keys=array_unique(array_reduce(array_map('array_keys',$data),'array_merge',[]));
      

      或者在函数中:

      function get_array_children_keys($data) {
          return array_unique(
              array_reduce(array_map('array_keys', $data), 'array_merge', [])
          );
      }
      

      现在让我们用一个例子来分解一下,这里有一些示例数据:

      [
          ['key1' => 0],
          ['key1' => 0, 'key2' => 0],
          ['key3' => 0]
      ]
      

      从最里面的函数开始,我们用 array_keys 函数运行 array_map:

      array_map('array_keys', $data)
      

      这给了我们所有子数组的键

      [
          ['key1'],
          ['key1', 'key2'],
          ['key3']
      ]
      

      然后我们使用 array_merge 回调和一个空数组作为初始值对数据运行 array_reduce:

      array_reduce(..., 'array_merge', []);
      

      这会将我们的多个数组转换为 1 个平面数组:

      [
          'key1',
          'key1',
          'key2',
          'key3'
      ]
      

      现在我们用 array_unique 去除我们的重复项:

      array_unique(...)
      

      最后得到我们所有的钥匙:

      [
          'key1',
          'key2',
          'key3'
      ]
      

      【讨论】:

        【解决方案8】:

        通过这个函数你可以从一个多维数组中获取所有的键

        function arrayKeys($array, &$keys = array()) {        
                foreach ($array as $key => $value) {
                    $keys[] = $key;
                    if (is_array($value)) {                
                        $this->arrayKeys($value, $keys);
                    }
                }
                return $keys;
        }
        

        【讨论】:

          【解决方案9】:

          虽然@raise answers 提供了一个快捷方式,但它在使用数字键时会失败。以下应该可以解决这个问题:

          $secondKeys=array_unique(call_user_func_array('array_merge', array_map('array_keys',$a)));
          

          array_map('array_keys',$a) : 循环获取密钥

          ...'array_merge'... : 合并键数组

          array_unique(...:(可选)获取唯一键。

          我希望它对某人有所帮助。

          更新:

          你也可以使用

          $secondKeys=array_unique(array_merge(...array_map('array_keys', $a)));
          

          这提供了与上述相同的答案,而且速度更快。

          【讨论】:

            【解决方案10】:

            只有如果所有记录都有相同的键你可以这样做:

            $firstItem = reset($array);
            $keys = array_keys($firstItem);
            

            显然,这不是该特定问题的正确答案,因为记录具有不同的键。但这可能是您在查看如何从所有键都相同的数组中检索二级键时发现的问题(我做过)。如果所有记录具有相同的键,您可以简单地将数组中的第一项与reset() 一起使用,并使用array_keys() 从第一项中获取键。

            【讨论】:

              【解决方案11】:

              我的建议,类似于this answer,但速度更快并且使用spread operator(PHP 5.6+)。

              array_merge(...array_values($fields))

              如果您想将名称移动到数组值并将键重置为 0..n,只需在最后一步中使用 array_keys

              array_keys(array_merge(...array_values($fields)))

              【讨论】:

              • 第一级在OP的问题中被索引,所以array_values()对于这个特定的问题不是必需的。
              猜你喜欢
              • 1970-01-01
              • 2014-05-11
              • 1970-01-01
              • 2017-10-21
              • 1970-01-01
              • 2011-08-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多