У меня возникли небольшие проблемы с попыткой сглаживания массивов особым образом.
Вот print_r
представление массива, который я хочу сгладить:
Array
(
[1] => Array
(
[8] => 1
[9] => 2
[10] => Array
(
[15] => Array
(
[22] => 1
)
[21] => 2
)
[11] => Array
(
[16] => Array
(
[23] => 1
)
)
)
[2] => Array
(
[12] => 1
)
[3] => Array
(
[13] => 1
)
[4] => Array
(
[14] => 1
)
[5] => 5
[6] => 6
[7] => 7
)
Я пытаюсь создать массив, в котором хранятся вышеуказанные индексы, но значение равно его позиции в массиве, очень похоже на исходный индекс (начиная с нуля).
Вот желаемый результат:
Array
(
[1] => 1
[2] => 2
[3] => 3
[4] => 4
[5] => 5
[6] => 6
[7] => 7
[8] => 1
[9] => 2
[10] => 3
[11] => 4
[12] => 1
[13] => 1
[14] => 1
[15] => 1
[16] => 1
[21] => 2
[22] => 2
[23] => 1
)
Как известно, пропущено от 17 до 20.
Моя функция такова:
function array_flatten ($array) {
$result = array ();
$count = 1;
while ($index = current($array)) {
$result[key($array)] = $count;
if (is_array($index)) {
$result = array_merge(array_flatten($index), $result);
}
next($array);
$count++;
}
return $result;
}
Строка $result = array_merge(array_flatten($index), $result);
, кажется, проблемы.Он возвращает:
Array
(
[1] => 1
[2] => 2
[3] => 3
[4] => 4
[5] => 5
[6] => 6
[7] => 7
)
Однако, если я запускаю var_dump(array_flatten($index));
в той же строке, он возвращает все массивы, которые я хочу объединить, с переменной $result
.
array
22 => int 1
array
15 => int 1
21 => int 2
array
23 => int 1
array
16 => int 1
array
8 => int 1
9 => int 2
10 => int 3
11 => int 4
array
12 => int 1
array
13 => int 1
array
14 => int 1
Кажется, что array_merge
на самом деле не объединяет эти массивы.
Есть ли что-то, что я делаю неправильно?Любые слова руководства очень ценятся.Спасибо.
Обновление
Решено!
Функция, которая выполняет необходимые действия:
function array_flatten($array, &$result = array()) {
$count = 1;
foreach($array as $index => $value) {
$result[$index] = $count;
if(is_array($value)) {
array_flatten($value, $result);
}
$count++;
}
return $result;
}