重置多维数组中的数组键名

11

我一直在寻找解决办法,但并没有真正成功。我有一个无限深度的父子多维数组。它是从数据库生成的,但问题在于,使用我的方法将平面数组排列成多维数组时,项目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个小时了,你打算回来吗?如果这个回答解决了你的问题,请点击答案旁边的勾选图标将其标记为已接受。 - Dan Grossman
4个回答

21

你真的需要添加 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;
    }
}

1
太棒了!这对我非常有效,而目前的正确答案却没有。 - Patrick

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

太好了!谢谢。我没有收到邮件,所以现在才查看。 - flicker
2
这个可以工作,但我失去了那些不是数字的数组键,我该如何只重新分配数字键?谢谢。 - flicker

12

我曾尝试解决同样的问题,这是代码:

$array = array_values($array);

这对于多维数组不起作用。上面的fix_keys()函数将起作用。https://3v4l.org/vGmmJ - dearsina

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;

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接