|
|
|
| Здравствуйте. Помогите пожалуйста переделать функцию которая нумерует многомерный ассоциативный массив. Что бы она работала рекурсивно и по всем уровням массива, а не только по трём:
function bruteTree( &$aArray, $iSearchIndex = 0, $iCounter = 0 ) {
# Массив результата :
$aResult = array();
# Перебираем массив :
foreach( $aArray as $sKey => $mItem ) {
$aResult[$iCounter] = $sKey;
$iCounter++;
}
# Перебираем ветки :
foreach( $aArray as $sKey => $mItem ) {
# Если у ветки есть разветвления :
if( is_array( $mItem ) ) {
foreach( $mItem as $sKey2 => $mItem2 ) {
# Добавление данных в массив :
$aResult[$iCounter] = $sKey2;
$iCounter++;
}
}
}
# Перебираем ветки :
foreach( $aArray as $sKey => $mItem ) {
# Если у ветки есть разветвления :
if( is_array( $mItem ) ) {
foreach( $mItem as $sKey2 => $mItem2 ) {
if( is_array( $mItem2 ) ) {
foreach( $mItem2 as $sKey3 => $mItem3 ) {
# Добавление данных в массив :
$aResult[$iCounter] = $sKey3;
$iCounter++;
}
}
}
}
}
# Перебираем ветки :
foreach( $aArray as $sKey => $mItem ) {
# Если у ветки есть разветвления :
if( is_array( $mItem ) ) {
foreach( $mItem as $sKey2 => $mItem2 ) {
if( is_array( $mItem2 ) ) {
foreach( $mItem2 as $sKey3 => $mItem3 ) {
# Если у ветки есть разветвления :
if( is_array( $mItem3 ) ) {
foreach( $mItem3 as $sKey4 => $mItem4 ) {
# Добавление данных в массив :
$aResult[$iCounter] = $sKey4;
$iCounter++;
}
}
}
}
}
}
}
return $aResult;
}
|
| |
|
|
|
|
|
|
|
для: p.pavluxa
(08.05.2015 в 16:54)
| |
<?php
function wlk($a, &$r, &$c)
{
foreach($a as $k =>$v) $r[$c++] = $k;
foreach($a as $k =>$v) if(is_array($v)) wlk($v, $r, $c);
}
$p = array();
$p['a'] = array('p' => 1, 'q' => array('v' => 2));
$p['b'] = array('t' => 1, 'l' => array('m' => 2));
$c = 0; $r = array();
wlk($p, $r, $c);
echo "<pre>";
print_r($p);
var_dump($c);
print_r($r);
?>
|
| |
|
|
|
|
|
|
|
для: Trianon
(08.05.2015 в 19:48)
| |
$p = Array
(
[Один] => 4
[Два] => Array
(
[Семь] => Array
(
[Десять] => Array
(
[Одиннадцать] => 13
)
)
)
[Три] => 12
[Четыре] => 7
[Пять] => Array
(
[Восемь] => 9
[Девять] => 16
)
[Шесть] => 10
)
|
Вот такой массив должно превратить в
Array
(
[0] => Один
[1] => Два,
....
)
А по Вашему примеру превращает не в той последовательности которая требуется | |
|
|
|
|
|
|
|
для: p.pavluxa
(08.05.2015 в 21:03)
| | >Вот такой массив должно превратить в
>Array
>(
> [0] => Один
> [1] => Два,
>....
>)
>
>А по Вашему примеру превращает не в той последовательности которая требуется
Ложь, наглая и гнусная.
Array
(
[0] => Один
[1] => Два
[2] => Три
[3] => Четыре
[4] => Пять
[5] => Шесть
[6] => Семь
[7] => Десять
[8] => Одиннадцать
[9] => Восемь
[10] => Девять
)
|
никак не противоречит тому, что вы написали.
PS.
обходов дерева не так уж много разных видов.
Фактически - в глубину и в ширину.
Еще можно добавить по паре вариантов - с разделением терминальных элементов от узловых и без оного.
Для обхода дерева в ширину не требуется (а раз так, читай - запрещена) рекурсия. Значит обход в глубину.
Раздельные циклы по терминальным ( is_array() == false) и узловым (is_array() == true) элементам были один-в-один сняты из вашего же кода (разделение #перебираем массив и #перебираем ветки)
Так что сделано все сугубо именно как требовалось.
Получите, распишитесь, что называется, и не стоит благодарности. | |
|
|
|
|
|
|
|
для: Trianon
(08.05.2015 в 23:22)
| | А вот чтоб ключи выстроились в порядке приведенных числительных - это явный обход в ширину,
при чем без разделения узел - не узел.
И такой обход не пишут рекурсией, а пишут стандартной парой накапливающихся очередей с пинг-понгом между ними, пока не опустеет.
Чисто итеративный алгоритм, перекладывать его на рекурсию - только портить.
<?
function wlk_bf($a, &$r, &$c)
{
$pair = array(array($a), array());
$flip = 0;
do
{
foreach($pair[$flip] as $b)
foreach($b as $k => $v)
{
$r[$c++] = $k;
if(is_array($v)) $pair[$flip^1][] = $v;
}
$pair[$flip] = array();
}
while(count($pair[$flip ^= 1]));
}
|
| |
|
|
|
|
|
|
|
для: Trianon
(09.05.2015 в 00:38)
| | Ваша функция даёт результат:
Array
(
[0] => Один
[1] => Два
[2] => Три
[3] => Четыре
[4] => Пять
[5] => Шесть
[6] => Семь
[7] => Десять
[8] => Одиннадцать
[9] => Восемь
[10] => Девять
)
|
А нужен:
Array
(
[0] => Один
[1] => Два
[2] => Три
[3] => Четыре
[4] => Пять
[5] => Шесть
[6] => Семь
[7] => Восемь
[8] => Девять
[9] => Десять
[10] => Одинадцать
)
|
Что бы массив перебирался по уровням. Что бы нумерация была сначало первого уровня, затем второго уровня и так далее.
ВЫ ГЕНИЙ! СПАСИБО ОГРОМНОЕ! | |
|
|
|