【问题标题】:array keys as values with multidimensional array数组键作为具有多维数组的值
【发布时间】:2015-10-02 18:22:47
【问题描述】:

我目前有一个像这样的数组

Array
(
    [7] => Array
        (
            [49] => 
            [41] => 
        )

    [8] => Array
        (
            [70] => 
            [69] => 
        )

    [105] => 
    [9] => 
    [10] => 
)

现在,我需要每个键来处理每个键,但我很难通过 foreach() 循环来获取它们,因为没有值。我一直在尝试使用 array_keys,但这忽略了多维键。有没有一种方法可以将键也分配为值,以获得这样的结构?

Array
(
    [7] => Array
        (
            [49] => 49
            [41] => 41
        )

    [8] => Array
        (
            [70] => 70
            [69] => 69
        )

    [105] => 105
    [9] => 9
    [10] => 10
)

这样我可以使用 foreach() 来获取每个键的值。我不知道这是否是最简单的方法,但我很想为正确的方向提供一些提示。谢谢!

【问题讨论】:

    标签: php arrays multidimensional-array


    【解决方案1】:

    使用array_walk_recursive() 将键作为值分配给值不是数组的每个条目。

    【讨论】:

    • 回调接收到key作为参数,但是没有接收到数组,那么它怎么知道给哪个子数组赋值呢?
    • @barmar 如果我们传递元素引用并更改回调函数中的值,那就没问题了。
    • @BerozaPaul 我在您的回答中看到了这一点。这个答案没有提到那个细节,而且并不明显。
    【解决方案2】:

    在这种情况下,我们可以使用 array_walk_recursive。在array_walk_recursive的回调函数中,如果我们传递元素引用,那么在回调函数中我们可以用key改变空值。

    array_walk_recursive($arr, function(&$item, $key){
        if(!$item && $key) $item  = $key;
    });
    
    print_r($arr);
    

    【讨论】:

      【解决方案3】:

      从 PHP7.4 开始,您可以享受“箭头函数”语法的简洁性。您仍然需要通过引用使叶节点的值可修改并手动将$k 的值分配给$v。箭头函数语法尝试(默认情况下)return 表达式中的值,但忽略返回值。

      代码:(Demo)

      $array = [
          7 => [49 => null, 41 => null],
          8 => [70 => null, 69 => null],
          105 => null,
          9 => null,
          10 => null
      ];
      
      array_walk_recursive($array, fn(&$v, $k) => $v = $k);
      var_export($array);
      

      输出:

      array (
        7 => 
        array (
          49 => 49,
          41 => 41,
        ),
        8 => 
        array (
          70 => 70,
          69 => 69,
        ),
        105 => 105,
        9 => 9,
        10 => 10,
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-09
        相关资源
        最近更新 更多