Сброс ключей массива в многомерном массиве

Я искал решение для этого без реального успеха. У меня есть многомерный массив родителей и детей без ограничений по глубине. Это генерируется из базы данных, но проблема в том, что идентификатор элемента становится ключом, используя мой способ организации плоского массива в многомерный массив, например:

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 (), но я не совсем знаю, что делать дальше. По сути, есть ли способ сбросить числовые ключи в многомерном массиве?

Спасибо за помощь!

4 ответов


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

Я пытался решить ту же проблему, вот код

$array = array_values($array);

вам действительно нужно добавить условие 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;
    }
}

правильный ответ сбросить все клавиши и не игнорировать не числовые клавиши, "Лобос" ответ шаг в правильном направлении, но сбросить тоже не числовые клавиши на уровне 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;

}