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

BlackTheMad

Новичок
Сброс ключей массива.

Добрый день. Существует следующая задача:
Необходимо сбросить ключи у массива без потери его структуры.

Поясняю.
Есть БД, в которой хранится дерево элементов в виде Adjacency List, т.е. с id и parent_id. Считываем его. Получаем:


$array[] = array("key" => 1, "p_key" => 0, "name" => "name1");
$array[] = array("key" => 2, "p_key" => 1, "name" => "name2");
$array[] = array("key" => 3, "p_key" => 2, "name" => "name3");
$array[] = array("key" => 4, "p_key" => 3, "name" => "name4");
$array[] = array("key" => 5, "p_key" => 1, "name" => "name5");


Формируем "массивное дерево" =) на основе этого массива, получаем:
PHP:
Array
(
  [1] => Array(
    [key] => 1, [p_key] => 0, [name] => name1, [children] => Array(
      [2] => Array([key] => 2, [p_key] => 1, [name] => name2, [children] => Array(
        [3] => Array ([key] => 3, [p_key] => 2, [name] => name3, [children] => Array(
          [4] => Array([key] => 4, [p_key] => 3, [name] => name4)
          )
        )
      )
    )
  [5] => Array(
    [key] => 5, [p_key] => 1, [name] => name5)
    )
  )
)

И всё хорошо. Но мне необходимо, чтобы ключи всех массивов и вложенных массивов начинались с 0 и далее по списку.
Вот.

Если кому интересно, то необходимо мне это для того, чтобы скормить этот массив функции json_encode, и отправить для построения дерева с помощью ExtJs. И если ключи идут по порядку, начиная с "0", то всё строится отлично. А если они начинаются не с нуля, то json_encode их упомянает и дерево не строится.

Заранее спасибо за любую информацию.
 

andymc

Новичок
array_values() поможет сбросить ключи, но в данном случае всё видмисо сложнее
 

cDLEON

Онанист РНРСlub
Отлаживайте дальше свой скрипт.
PHP:
$array=Array();
$array[] = array("key" => 1, "p_key" => 0, "name" => "name1");
$array[] = array("key" => 2, "p_key" => 1, "name" => "name2");
$array[] = array("key" => 3, "p_key" => 2, "name" => "name3");
$array[] = array("key" => 4, "p_key" => 3, "name" => "name4");
$array[] = array("key" => 5, "p_key" => 1, "name" => "name5");
этот пример в любом случае первый элемент создаст с ключём 0.
 

BlackTheMad

Новичок
Хм. Видимо усталось сказывается.
Я только что понял, что задача со сбросом ключей едва ли разрешима. Потому что сбрасывать надо не все ключи...А только те, которыми нумеруются массивы. А это уже на порядок сложнее.
А так для сброса ключей отлично бы подошла функция из комментариев на Php.net (спасибо, andymc)
PHP:
function numerieren($array)
{
$array_v = array_values($array);
$count_v = count($array_v);

for ($i=0; $i<$count_v; $i++)
  if (is_array($array_v[$i]))
    $array_v[$i] = numerieren($array_v[$i]);
return $array_v;
}
Видимо, придется обрабатывать строку напильником после применения json_encode.

Хотя, в принципе, учитывая, что записи идут с фиксированным числом полей, можно и по оффСету выводить. Но опять-таки...некрасиво это =)
 
Сверху