Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Упростить функцию сделав работу через рекурсию
 
 автор: p.pavluxa   (08.05.2015 в 16:54)   письмо автору
 
 

Здравствуйте. Помогите пожалуйста переделать функцию которая нумерует многомерный ассоциативный массив. Что бы она работала рекурсивно и по всем уровням массива, а не только по трём:

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;
}

  Ответить  
 
 автор: Trianon   (08.05.2015 в 19:48)   письмо автору
 
   для: 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);


?>

  Ответить  
 
 автор: p.pavluxa   (08.05.2015 в 21:03)   письмо автору
 
   для: Trianon   (08.05.2015 в 19:48)
 


$p = Array
(
    [Один] => 4
    [Два] => Array
        (
            [Семь] => Array
                (
                    [Десять] => Array
                        (
                            [Одиннадцать] => 13
                        )

                )

        )

    [Три] => 12
    [Четыре] => 7
    [Пять] => Array
        (
            [Восемь] => 9
            [Девять] => 16
        )

    [Шесть] => 10
)

Вот такой массив должно превратить в
Array
(
[0] => Один
[1] => Два,
....
)

А по Вашему примеру превращает не в той последовательности которая требуется

  Ответить  
 
 автор: Trianon   (08.05.2015 в 23:22)   письмо автору
 
   для: 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   (09.05.2015 в 00:38)   письмо автору
 
   для: 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]));
}

  Ответить  
 
 автор: p.pavluxa   (09.05.2015 в 14:12)   письмо автору
 
   для: 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] => Одинадцать
 



Что бы массив перебирался по уровням. Что бы нумерация была сначало первого уровня, затем второго уровня и так далее.

ВЫ ГЕНИЙ! СПАСИБО ОГРОМНОЕ!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования