【问题标题】:Reset array keys in multidimensional array重置多维数组中的数组键
【发布时间】:2011-10-22 21:19:15
【问题描述】:

我一直在寻找解决方案,但没有真正成功。我有一个多维的父母和孩子数组,没有深度限制。这是从数据库生成的,但问题是使用我将平面数组排列成多维数组的方式,项目 ID 成为键,如下所示:

Array(

[28] => Array
        (
            [id] => 28
            [color] => #ff24e5
            [name] => Personal
            [parent_id] => 
            [children] => Array
                (
                    [23] => Array
                        (
                            [id] => 23
                            [color] => #41c3a3
                            [name] => Shopping
                            [parent_id] => 28
                            [children] => Array
                                (
                                    [22] => Array
                                        (
                                            [id] => 22
                                            [color] => #8be32b
                                            [name] => Deals
                                            [parent_id] => 23
                                            [children] => Array
                                                (
                                                )
                                        )
                                )
                        )

                    [150] => Array
                        (
                            [id] => 150
                            [color] => #e9a3f0
                            [name] => Orders
                            [parent_id] => 28
                            [children] => Array
                                (
                                )
                        )
                )
        )
)

我想要的是一个执行以下操作的函数:

Array (
[0] => Array
        (
            [id] => 28
            [color] => #ff24e5
            [name] => Personal
            [parent_id] => 
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 23
                            [color] => #41c3a3
                            [name] => Shopping
                            [parent_id] => 28
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 22
                                            [color] => #8be32b
                                            [name] => Deals
                                            [user_id] => 1
                                            [selected] => 0
                                            [parent_id] => 23
                                            [children] => Array
                                                (
                                                )
                                        )
                                )
                        )

                    [1] => Array
                        (
                            [id] => 150
                            [color] => #e9a3f0
                            [name] => Orders
                            [parent_id] => 28
                            [children] => Array
                                (
                                )
                        )
                )
        )
)

基本上从 0 开始重新分配键。我尝试了很多方法,但我假设我需要找到一个递归解决方案,当我尝试这样做时,它破坏了我的数组。我正在阅读 array_walk_recursive() 函数,但我不太清楚除此之外还能做什么。本质上,有没有办法重置多维数组中的数字键?

感谢您的帮助!

【问题讨论】:

  • 在您提出问题后,我就回答了您的问题。 2小时后,你要回来吗?如果这回答了您的问题,请单击答案旁边的复选标记图标将其标记为已接受。

标签: php arrays recursion


【解决方案1】:

正确答案会重置所有键并且不要忽略非数字键,“Lobos”答案是朝着正确方向迈出的一步,但也会将非数字键重置为 2 级及以下。 对我来说,这完成了完美的工作

function array_values_recursive($array) {
$temp = array();
foreach ($array as $key => $value) {
    if (is_numeric($key)) {
        $temp[] = is_array($value) ? array_values_recursive($value) : $value;
    } else {
        $temp[$key] = is_array($value) ? array_values_recursive($value) : $value;
    }
}
return $temp;

}

【讨论】:

    【解决方案2】:

    您确实需要添加 is_numeric 条件来阻止文本键混淆...

    function fix_keys($array) {
    
        foreach ($array as $k => $val) {
    
            if (is_array($val)) 
                $array[$k] = $fix_keys($val); //recurse
        }
    
        if( is_numeric($k) )
            return array_values($array);
    
        return $array;
    }
    

    我这样做了:

    function fix_keys($array) {
        $numberCheck = false;
        foreach ($array as $k => $val) {
            if (is_array($val)) $array[$k] = fix_keys($val); //recurse
            if (is_numeric($k)) $numberCheck = true;
        }
        if ($numberCheck === true) {
            return array_values($array);
        } else {
            return $array;
        }
    }
    

    【讨论】:

    • 太棒了!这对我来说非常有效,而当前的正确答案却没有。
    【解决方案3】:
    function fix_keys($array) {
      foreach ($array as $k => $val) {
        if (is_array($val)) 
          $array[$k] = fix_keys($val); //recurse
      }
      return array_values($array);
    }
    

    【讨论】:

    • 太棒了!谢谢。没有收到电子邮件,所以我现在才查看。
    • 这可行,但我丢失了非数字的数组键,我将如何只重新分配数字键?谢谢
    【解决方案4】:

    我试图解决同样的问题,这里是代码

    $array = array_values($array);
    

    【讨论】:

    • 这不适用于多维数组。上面的 fix_keys() 函数将起作用。 3v4l.org/vGmmJ
    猜你喜欢
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    相关资源
    最近更新 更多