[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: из двумерного массива - многомерный
xnscripter
Есть двумерный массив:

Array
(
[10.140.5.23] => Array
(
[0] => 10.140.5.101
[1] => 10.140.5.72
[2] => 10.140.5.43
[3] => 10.140.5.104
[4] => 10.140.5.77
[5] => 10.140.5.20
)

[10.140.5.20] => Array
(
[0] => 10.140.5.94
)

[10.140.5.94] => Array
(
[0] => 10.140.5.91
)

[10.140.5.77] => Array
(
[0] => 10.140.5.160
)
)

Каким способом данный массив преобразовать в многомерный с любым уровнем вложенности?
Если возможно с примером.




Спустя 3 минуты, 3 секунды (11.10.2011 - 21:53) linf написал(а):
1. Выравняйте распечатку массива ТАБОМ.
2. Поясните задачу. Двумерный массив тоже относится к многомертым, тоесть ваш массив многомерный. Что вы из него хотите сделать, сколько уровней мерности и исходя из каких данных?


Спустя 16 минут, 14 секунд (11.10.2011 - 22:09) xnscripter написал(а):
Array 
(
[
10.140.5.23] => Array
(
[
0] => 10.140.5.101
[1] => 10.140.5.72
[2] => 10.140.5.43
[3] => 10.140.5.104
[4] => 10.140.5.77
[5] => 10.140.5.20
)

[
10.140.5.20] => Array
(
[
0] => 10.140.5.94
)

[
10.140.5.94] => Array
(
[
0] => 10.140.5.91
)

[
10.140.5.77] => Array
(
[
0] => 10.140.5.160
)
)


Собственно массив, ключи - ip адреса, значения каждого ключа - массив ip адресов, принадлежащих данному ip (ключу).
На выходе хотелось получить из выше обозначенного массива примерно следующий массив:

Array 
(
[
10.140.5.23] => Array
(
[
0] => 10.140.5.101
[1] => 10.140.5.72
[2] => 10.140.5.43
[3] => 10.140.5.104
[4] => 10.140.5.77 => Array
(
[
0] => 10.140.5.160
)
[
5] => 10.140.5.20 => Array
(
[
0] => 10.140.5.94 => Array
(
[
0] => 10.140.5.91
)
)
)
)


Уровней мерности я не знаю сколько, хотелось бы универсальный способ посмотреть, чтобы разобраться.

Спустя 12 часов, 52 минуты, 41 секунда (12.10.2011 - 11:02) Draftpad написал(а):
Вы видимо абсолютно не понимаете устройство языка и массивов в целом.
Нету такой конструкции, как:

[4] => 10.140.5.77 => Array


В массиве есть ключи и значения, к ключам вы можете задавать дополнительный массив, чтобы по обращению к нему, был доступен вложенный. Но в значения, нельзя вставлять массивы, на то они и значения.
Попробуйте использовать другую конструкцию массива.
Пример:

$lan = Array (
"0" => Array (
"ip" => "10.140.5.0",
"admin" => "Gringo#1",
"children" => Array ("10.140.5.101","10.140.5.72","10.140.5.43","10.140.5.104")
),

"1" => Array (
"ip" => "10.110.8.0",
"admin" => "Gringo#2",
"children" => Array ("10.110.8.53","10.110.8.12","10.110.8.87","10.110.8.225")
)
);


echo print_r($lan);


Цитата

Array
(
    [0] => Array
        (
            [ip] => 10.140.5.0
            [admin] => Gringo#1
            [children] => Array
                (
                    [0] => 10.140.5.101
                    [1] => 10.140.5.72
                    [2] => 10.140.5.43
                    [3] => 10.140.5.104
                )

        )

    [1] => Array
        (
            [ip] => 10.110.8.0
            [admin] => Gringo#2
            [children] => Array
                (
                    [0] => 10.110.8.53
                    [1] => 10.110.8.12
                    [2] => 10.110.8.87
                    [3] => 10.110.8.225
                )

        )

)


Такая конструкция будет более гибкой, и к каждой подсети, вы сможете добавлять дочерние адреса компьютеров, например. подключенных к хабу на определённом доме.

Спустя 42 минуты, 46 секунд (12.10.2011 - 11:44) xnscripter написал(а):
Повторю вопрос.


Есть массив:
Array 
(
[
10.140.5.23] => Array
(
[
0] => 10.140.5.101
[1] => 10.140.5.72
[2] => 10.140.5.43
[3] => 10.140.5.104
[4] => 10.140.5.77
[5] => 10.140.5.20
)

[
10.140.5.20] => Array
(
[
0] => 10.140.5.94
)

[
10.140.5.94] => Array
(
[
0] => 10.140.5.91
)

[
10.140.5.77] => Array
(
[
0] => 10.140.5.160
)
)


Из него необходимо получить следующий:

Array
(
[
0] => Array
(
[
k_item] => 1
[s_name] => 10.140.5.23
[a_tree] => Array
(
[
0] => Array
(
[
k_item] => 2
[s_name] => 10.140.5.101
[a_tree] => Array
(
)
)
[
1] => Array
(
[
k_item] => 3
[s_name] => 10.140.5.72
[a_tree] => Array
(
)
)
[
2] => Array
(
[
k_item] => 4
[s_name] => 10.140.5.43
[a_tree] => Array
(
)
)
[
3] => Array
(
[
k_item] => 5
[s_name] => 10.140.5.104
[a_tree] => Array
(
)
)
[
4] => Array
(
[
k_item] => 6
[s_name] => 10.140.5.77
[a_tree] => Array
(
[
0] => Array
(
[
k_item] => 7
[s_name] => 10.140.5.160
[a_tree] => Array
(
)
)
)
)
[
5] => Array
(
[
k_item] => 8
[s_name] => 10.140.5.20
[a_tree] => Array
(
[
0] => Array
(
[
k_item] => 8
[s_name] => 10.140.5.94
[a_tree] => Array
(
[
0] => Array
(
[
k_item] => 8
[s_name] => 10.140.5.91
[a_tree] => Array
(
)
)
)
)
)
)
)
)
)



Необходим пример для этого случая.

P.S. Мне не двумерный массив на выходе нужен с разложенными ip по подсетям.
Из исходного массива нужно получить многомерный массив неизвестного кол-ва уровней вложенности.
Как я это понимаю нужна рекурсивная функция, которая будет гулять по веткам создаваемого массива, добавляя необходимые значения в нужное место.

Спустя 12 минут, 23 секунды (12.10.2011 - 11:57) Bezdna написал(а):

Спустя 14 минут, 38 секунд (12.10.2011 - 12:11) xnscripter написал(а):
Возможно, пример рекурсии продемонстрировать можете?

Спустя 5 часов, 20 минут, 39 секунд (12.10.2011 - 17:32) linf написал(а):
Цитата (Draftpad @ 12.10.2011 - 12:02)
Вы видимо абсолютно не понимаете устройство языка и массивов в целом.

Нет, это вы не понимаете, массивы бывают разными, и ассоциативными такого вида как у него.

---------------------------------------------------------------------------------------------------- ---------

xnscripter, а зачем так сильно ветвить то, опишите конечную цель, может быть подскажем другое решение, и дело окажется вовсе не в массивах?

Спустя 52 минуты, 54 секунды (12.10.2011 - 18:25) Draftpad написал(а):
linf, сами то верите в тот бред, который пишите?

Вообразим, что мы наркоманы живущие в другой галактике и такая конструкция возможна:

$x =
Array 
(
[10.140.5.23] => Array
(
[0] => 10.140.5.101
[1] => 10.140.5.72
[2] => 10.140.5.43
[3] => 10.140.5.104
[4] => 10.140.5.77 => Array
(
[0] => 10.140.5.160
)
[5] => 10.140.5.20 => Array
(
[0] => 10.140.5.94 => Array
(
[0] => 10.140.5.91
)
)
)
)



Что вам выдаст это:
echo $x["10.140.5.23"]["4"];

Выдаст значение этого ключа "10.140.5.77" ? Или выдаст просто "Array", как указатель на то, что у ключа нету одного значения, а присутствует массив? Сидите пока и фантазируйте.

В конце концов:
$x = Array ("key1" => "val1" => array("key2" => "val2"));

Выругается на две стрелки и пошлёт в лес.

И напоследок, если не разбираетесь в теме, не утверждайте подробных вещей.

xnscripter, какую цель вы преследуете? Зачем составлять такие странные массивы?
хочется добавить, что у вас не верное представление о подсетях, ибо логика, по которой происходит построение вашего массива у лишь одной подсети 10.140.5.* вообще не ясна.

Спустя 1 минута, 13 секунд (12.10.2011 - 18:26) Guest написал(а):
Конечная цель - сделать из существующего массива дерево:


<?php
//пример массива
$a_tree=array(
array('k_item' =>1,'s_name' =>'1','a_tree' => array(
array('k_item' =>2,'s_name' =>'1.1','a_tree' => array(
array('k_item' =>3,'s_name' =>'1.1.1','a_tree' => array()),
array('k_item' =>4,'s_name' =>'1.1.2','a_tree' => array()),
array('k_item' =>5,'s_name' =>'1.1.3','a_tree' => array(
array('k_item' =>6,'s_name' =>'1.1.3.1','a_tree' => array())
)),
)),

array('k_item' =>7,'s_name' =>'1.2','a_tree' => array()),
array('k_item' =>8,'s_name' =>'1.3','a_tree' => array(
array('k_item' =>9,'s_name' =>'1.3.1','a_tree' => array()),
array('k_item' =>10,'s_name' =>'1.3.2','a_tree' => array())
)),

array('k_item' =>11,'s_name' =>'1.4','a_tree' => array(
array('k_item' =>12,'s_name' =>'1.4.1','a_tree' => array())
)),
)),

array('k_item' =>13,'s_name' =>'2','a_tree' => array()),
array('k_item' =>14,'s_name' =>'3','a_tree' => array(
array('k_item' =>15,'s_name' =>'3.1','a_tree' => array())
))
);


function tree_print(&$x)
{
if(empty($x)) return;
echo "<ul>\n";
for($i=0;$i<count($x);$i++)
{
echo "<li id=\"".($x[$i]['k_item'] + 1)."\"><span>".$x[$i]['s_name']."</span>";
tree_print($x[$i]['a_tree']);
echo "</li>\n";
}
echo "</ul>\n";
}
?>
<ul class="simpleTree">
<
li class="root" id="1"><span>Просмотр маршрута</span>
<?php tree_print($a_tree); ?>
</li>
</
ul>


Если есть способ из существующего массива в один проход сделать что-то похожее, с удовольствием посмотрю.
Заранее спасибо.

Спустя 6 минут, 24 секунды (12.10.2011 - 18:32) xnscripter написал(а):
2 Draftpad :
- Выдаст просто Array естественно.
- В моем втором сообщение в массиве который хотелось получить - ошибка построения, не спорю.
- С логикой у меня все в порядке, и условия построения многомерного массива, который хочется в итоге получить легко понять , если посмотреть на тот массив, с которым работаем.

А цель моя - получить рекурсивную функцию получения описанного выше мной массива.

P.S. Не стоит искать логику основываясь на своих представлениях действительности.

Спустя 14 минут, 13 секунд (12.10.2011 - 18:47) linf написал(а):
Цитата (Draftpad @ 12.10.2011 - 19:25)
linf, сами то верите в тот бред, который пишите?
Сидите пока и фантазируйте.
И напоследок, если не разбираетесь в теме, не утверждайте подробных вещей.

xnscripter, какую цель вы преследуете? Зачем составлять такие странные массивы? хочется добавить, что у вас не верное представление о подсетях, ибо логика, по которой происходит построение вашего массива у лишь одной подсети 10.140.5.* вообще не ясна.

Вы на форуме четвертый день, а уже хамите, и все у вас не правы.
К чему такое невежество?

Спустя 6 минут, 59 секунд (12.10.2011 - 18:54) xnscripter написал(а):
Господа, просьба личные отношения выяснять в лс.
По теме есть мысли?

Спустя 25 минут, 45 секунд (12.10.2011 - 19:19) xnscripter написал(а):
Вопрос в 5 сообщении темы.

Спустя 18 минут, 10 секунд (12.10.2011 - 19:38) xnscripter написал(а):
2 linf:
Глубина будет известна в процессе преобразования одного массива в другой.
На основании исходящего массива должен формироваться требуемый.
Все необходимые данные для преобразования есть в исходном массиве.

Происходить должно как-то так:
Обходим ЗНАЧЕНИЯ исходного двумерного ассоциативного массива,
если значение ключа совпадает с одним из ключей этого массива то запихиваем ключ вместе с его значениями в эту ветку, т.е. вложенность будет увеличиваться

P.S. Надеюсь более менее правильно объяснил.

Спустя 1 час, 39 минут, 42 секунды (12.10.2011 - 21:17) Гость_Greg1978 написал(а):
Это когда я утверждал в том что в корне необходима задача а не вопрос о её решении многие здесь смеялись.
Задача номер раз?
Задача номер два?
не как реализовать а что нужно для ....

Спустя 42 минуты, 48 секунд (12.10.2011 - 22:00) linf написал(а):
Цитата (xnscripter @ 12.10.2011 - 20:38)
Происходить должно как-то так:
Обходим ЗНАЧЕНИЯ исходного двумерного ассоциативного массива,
если значение ключа совпадает с одним из ключей этого массива то запихиваем ключ вместе с его значениями в эту ветку, т.е. вложенность будет увеличиваться

P.S. Надеюсь более менее правильно объяснил.

Так, тут все понятно, еще пару вопросов:
1. Что должно быть в конце? просто распечатать? или во что то преобразовать и сохранить?
2. Так там изначально в ветке (например по 3 уровню) уже массив или что?

Спустя 13 минут, 14 секунд (12.10.2011 - 22:13) xnscripter написал(а):
Из исходного массива необходимо сформировать дерево (<ul><li>) и вывести в окно браузера, учитывая все выше перечисленные условия :\

Спустя 6 минут, 16 секунд (12.10.2011 - 22:20) xnscripter написал(а):
Я прекрасно понимаю что задача не каждому под силу, но господа просматривающие тему, вы бы хоть мысли писали, в какую сторону думать.

Спустя 9 минут, 7 секунд (12.10.2011 - 22:29) linf написал(а):
xnscripter
Посижу пару часов, может быть чего-нибуть напишу.

Спустя 1 минута, 37 секунд (12.10.2011 - 22:30) bodja написал(а):
Ну вы блин даете. ;)

<?php
$arr=array();
$m=array();
$m[0]=$arr;
$m[0][0]=1;
$m[0][1]=2;
$m[0][1]=$arr;
$m[0][1][0]=1;
$m[0][1][1]=2;
$m[5][0]=1;
$m[5][1]=2;
print_r ($m);
?>


результат

Цитата
Array ( [0] => Array ( [0] => 1 [1] => Array ( [0] => 1 [1] => 2 ) ) [5] => Array ( [0] => 1 [1] => 2 ) )

Спустя 7 минут, 35 секунд (12.10.2011 - 22:38) xnscripter написал(а):
Цитата (bodja @ 12.10.2011 - 19:30)
Ну вы блин даете. ;)

<?php
$arr=array();
$m=array();
$m[0]=$arr;
$m[0][0]=1;
$m[0][1]=2;
$m[0][1]=$arr;
$m[0][1][0]=1;
$m[0][1][1]=2;
$m[5][0]=1;
$m[5][1]=2;
print_r ($m);
?>


результат

Цитата
Array ( [0] => Array ( [0] => 1 [1] => Array ( [0] => 1 [1] => 2 ) ) [5] => Array ( [0] => 1 [1] => 2 ) )

Это все понятно, а как обойти исходный массив чтобы на выходе получить дерево?

Спустя 10 минут, 15 секунд (12.10.2011 - 22:48) bodja написал(а):
Ну я же показал эту строчку

Цитата
$m[0]=$arr;


ей все равно будет пустым этот массив или нет.

<?php
$arr=array();
$m=array();
$arr[0]=1;
$arr[5]=5;
$m[0]=$arr;
$m[1][0]=1;
$m[1][1]=2;
print_r ($m);
?>


результат

Цитата
Array ( [0] => Array ( [0] => 1 [5] => 5 ) [1] => Array ( [0] => 1 [1] => 2 ) )

Спустя 12 часов, 47 минут, 20 секунд (13.10.2011 - 11:35) xnscripter написал(а):
2 bodja:
на конкретной задаче знания не хотите продемонстрировать?
прочтите 5 сообщение в теме и попробуйте сделать то, что там написано и отпишитесь о результатах.

Спустя 36 минут, 27 секунд (13.10.2011 - 12:12) bodja написал(а):
Спасибо,но я предпочитаю подсказывать и заставлять людей немножко думать самим. biggrin.gif
Так что подождем спортсменов ,или обращайтесь во флем ,там есть тема "задания для практики"
По вашей задаче,есть два пути решения,создавать статически или динамическую вложеность в массиве.

Спустя 1 час, 2 минуты, 17 секунд (13.10.2011 - 13:14) xnscripter написал(а):
2 bodja:
Правильно, прорабом быть проще, чем рабочим :\

Спустя 23 минуты (13.10.2011 - 13:37) Игорь_Vasinsky написал(а):
Цитата
Array
(
[10.140.5.23] => Array
  (
  [0] => 10.140.5.101
  [1] => 10.140.5.72
  [2] => 10.140.5.43
  [3] => 10.140.5.104
  [4] => 10.140.5.77 => Array
   (
   [0] => 10.140.5.160
   )
  [5] => 10.140.5.20 => Array
   (
   [0] => 10.140.5.94 => Array
    (
    [0] => 10.140.5.91
    )
   )
  )
)


может так:

Предположем что в начале есть одномерный индексный массив

$ip_array = array(
[0] => 10.140.5.101,
[1] => 10.140.5.72,
[2] => 10.140.5.43,
[3] => 10.140.5.104,
);
тогда чтоб добавить массив в подуровень, нужно сначала проверить есть ли ip в массиве

... вообщем чёт неправильно у тя.

Тебе индексныймассив несканает, т.е. те нужен смешенный массив

1. Если такой IP есть в массиве есть, то нужно у этого элемента перемещать значение в ключ, а взначение помещать новый IP, следовательно должна ещёбыть проверка ключей, еслиявляетсямассивом - то проверить ключ, если он = IP - то дописать элемент в массив, и тоже с массивами 3,4,5, n уровня

Очень невыгодная схема.

Спустя 19 минут, 59 секунд (13.10.2011 - 13:57) xnscripter написал(а):
Хм а если предположить что исходный массив создается из файла с таким содержанием:

10.140.5.101 10.140.5.23
10.140.5.72 10.140.5.23
10.140.5.43 10.140.5.23
10.140.5.104 10.140.5.23
10.140.5.77 10.140.5.23
10.140.5.20 10.140.5.23
10.140.5.94 10.140.5.20
10.140.5.91 10.140.5.94
10.140.5.160 10.140.5.77

Исходя из этого, как будет выглядеть более выгодная схема?

Спустя 27 минут (13.10.2011 - 14:24) Placido написал(а):
Дискяймер: с php познакомился недавно, прошу не судить строго.

$in = Array (

Свернутый текст

"10.140.5.23" => Array
(
"0" => "10.140.5.101",
"1" => "10.140.5.72",
"2" => "10.140.5.43",
"3" => "10.140.5.104",
"4" => "10.140.5.77",
"5" => "10.140.5.20",
),


"10.140.5.20" => Array
(
"0" => "10.140.5.94"
),

"10.140.5.94" => Array
(
"0" => "10.140.5.91"
),

"10.140.5.77" => Array
(
"0" => "10.140.5.160"
)


);
$out = array();
$flag = false;


foreach ($in as $key => $value)
{
add2Array($out, $key, $value, $flag);
if ($flag == false)
$out[$key] = $value;
}
print_r($out);

function add2Array(&$out, $key, $value, &$flag)
{
foreach ($out as $k => &$v)
{
if (is_array($v))
add2Array($v, $key, $value, $flag);
elseif ($v == $key)
{
$v = array($key => $value);
$flag = true;
break;
}
else
$flag = false;
}
}



Результат:
Свернутый текст
Array
(
[10.140.5.23] => Array
(
[0] => 10.140.5.101
[1] => 10.140.5.72
[2] => 10.140.5.43
[3] => 10.140.5.104
[4] => Array
(
[10.140.5.77] => Array
(
[0] => 10.140.5.160
)

)

[5] => Array
(
[10.140.5.20] => Array
(
[0] => Array
(
[10.140.5.94] => Array
(
[0] => 101.140.5.91
)

)

)

)

)

)


Спустя 29 минут, 40 секунд (13.10.2011 - 14:54) Игорь_Vasinsky написал(а):
Сейчас получается - 1й уровень массива индексный, 2й ассоц.

вообщем при проверке всёравно ресурсов тратиться будет неоправданно темболее чтовложенность неизвестна, может рассмотреть БД для хранения?

Спустя 36 минут (13.10.2011 - 15:30) xnscripter написал(а):
БД хотелось бы рассматривать в последнюю очередь.


Спустя 4 минуты, 43 секунды (13.10.2011 - 15:35) Игорь_Vasinsky написал(а):
ну тут на каждой вложенности is_array() юзать придётся + проверять на наличие в массиве через in_array()


Спустя 7 минут, 4 секунды (13.10.2011 - 15:42) xnscripter написал(а):
Есть ли возможность каким-либо образом узнать ip, у которого уровень вложенности будет максимальный?

Спустя 14 минут, 31 секунда (13.10.2011 - 15:56) Игорь_Vasinsky написал(а):
а скока их максимум в подсети может?

допустим 5

Я бы сделал функцию для проверки вложенности уровней массива

в качестве аргумента массив

function getLevel($array)
{
$i = 1;

foreach($array as $string)
{
if(is_array($string))
{
$i ++;
foreach($string as $substring)
{
if(is_array($substring))
{
$i++;
foreach($substring as $substring2)
{
.....
break;
}
}
}
}

break;
}
return $i;
}


смысл такой - проверять каждый элемент массива, подмассива на is_array и в случае true увеличевать $i;

Может в php есть и штатная функция, но я невкурсе... но это похожена говнокодец ;)

Спустя 19 часов, 35 минут, 50 секунд (14.10.2011 - 11:32) xnscripter написал(а):
Есть подозрение что существует более простые методы.
Возможно ли к исходному файлу к каждой строке добавить id родителя?

Спустя 6 минут, 53 секунды (14.10.2011 - 11:39) Игорь_Vasinsky написал(а):
Кстати как вариант можно писать в файлы по IP родителя

файл 10.140.5.0.ip

10.140.5.101
10.140.5.72
10.140.5.43
10.140.5.104



Т.е он будет автоматически создаваться и дописываться при

file_put_contents($file, $subIP . '\r\n', FILE_APPEND);


новый IP подсетки будет писаться с новой строки

Спустя 8 минут, 30 секунд (14.10.2011 - 11:47) xnscripter написал(а):
Возможно я не так выразился.
Скорее не к файлу, а к одномерному массиву с теми же данными.

Допустим изначально у всех id = 0.
Т.е. мы не многомерный массив делаем из исходного массива, а манипулируем исходным чтобы проставить id и pid (parent id) для каждой значения массива,
и уже после подобных преобразований строить дерево.

Спустя 16 минут, 54 секунды (14.10.2011 - 12:04) xnscripter написал(а):
Уточню, массив следующего вида:
$arr = array(
array("id" => "0","ip" => "10.140.5.23", "pid" => "null"),
array("id" => "1","ip" => "10.140.5.101", "pid" => "10.140.5.23"),
array("id" => "2","ip" => "10.140.5.72", "pid" => "10.140.5.23"),
array("id" => "3","ip" => "10.140.5.43", "pid" => "10.140.5.23"),
array("id" => "4","ip" => "10.140.5.104", "pid" => "10.140.5.23"),
array("id" => "5","ip" => "10.140.5.77", "pid" => "10.140.5.23"),
array("id" => "6","ip" => "10.140.5.20", "pid" => "10.140.5.23"),
array("id" => "7","ip" => "10.140.5.94", "pid" => "10.140.5.20"),
array("id" => "8","ip" => "10.140.5.91", "pid" => "10.140.5.94"),
array("id" => "9","ip" => "10.140.5.160", "pid" => "10.140.5.77")
);


Т.е. pid с ip заменяем на id родителя.
Возможен такой вариант?

Спустя 32 секунды (14.10.2011 - 12:05) Игорь_Vasinsky написал(а):
это напряги с массивом + напряги с файловой структурой.

Здесть на форуме реализован тег <li> как [*]

Если писать в файл так



10.200.23.01
|10.200.23.200
||10.20.01.00
||10.20.30.40

Спустя 9 минут, 52 секунды (14.10.2011 - 12:15) xnscripter написал(а):
Реализация на файлах мягко говоря смущает :\
Вкрадываются подозрения что можно обойтись массивами.

Спустя 4 часа, 46 минут, 3 секунды (14.10.2011 - 17:01) alive написал(а):
а что вариант Placido не канает, или еще вкусняшек надо?

Спустя 20 минут, 24 секунды (14.10.2011 - 17:21) xnscripter написал(а):
2 alive: до его сообщения до того же дошел, проблема в том, чтобы на выходе был массив вида:

Свернутый текст

Array 
(
[
0] => Array
(
[
k_item] => 1
[s_name] => 10.140.5.23
[a_tree] => Array
(
[
0] => Array
(
[
k_item] => 2
[s_name] => 10.140.5.101
[a_tree] => Array
(
)
)
[
1] => Array
(
[
k_item] => 3
[s_name] => 10.140.5.72
[a_tree] => Array
(
)
)
[
2] => Array
(
[
k_item] => 4
[s_name] => 10.140.5.43
[a_tree] => Array
(
)
)
[
3] => Array
(
[
k_item] => 5
[s_name] => 10.140.5.104
[a_tree] => Array
(
)
)
[
4] => Array
(
[
k_item] => 6
[s_name] => 10.140.5.77
[a_tree] => Array
(
[
0] => Array
(
[
k_item] => 7
[s_name] => 10.140.5.160
[a_tree] => Array
(
)
)
)
)
[
5] => Array
(
[
k_item] => 8
[s_name] => 10.140.5.20
[a_tree] => Array
(
[
0] => Array
(
[
k_item] => 8
[s_name] => 10.140.5.94
[a_tree] => Array
(
[
0] => Array
(
[
k_item] => 8
[s_name] => 10.140.5.91
[a_tree] => Array
(
)
)
)
)
)
)
)
)
)

Спустя 18 часов, 32 минуты, 17 секунд (15.10.2011 - 11:53) xnscripter написал(а):
Тему можно закрывать, вопрос решён.

Спустя 2 часа, 47 минут, 44 секунды (15.10.2011 - 14:41) linf написал(а):
пример то хоть покажи)

Спустя 47 минут, 54 секунды (15.10.2011 - 15:29) alive написал(а):
моя версия ;)
Свернутый текст
<?php
$in = Array(
'10.140.5.101' => '10.140.5.23',
'10.140.5.72' => '10.140.5.23',
'10.140.5.43' => '10.140.5.23',
'10.140.5.104' => '10.140.5.23',
'10.140.5.77' => '10.140.5.23',
'10.140.5.20' => '10.140.5.23',
'10.140.5.94' => '10.140.5.20',
'10.140.5.91' => '10.140.5.94',
'10.140.5.160' => '10.140.5.77',
'левый - IP -2' => '10.140.5.77',
'левый - IP' => '000.99.1'
);

// --------------- функция определения уникальных деревьев --------------- >
function get_front($arr_in)
{
$i = 0;
$arr_out = array();
foreach (array_count_values($arr_in) as $k => $v)
{
$j = 0;
foreach ($arr_in as $key => $value)
if($k == $key)
$j++;
if($j == 0)
{
$arr_out[$i] = $k;
$i++;
}
}

return $arr_out;
}

// --------------- функция определения уникальных ветвей --------------- >
function get_stem($arr_stem, $arr_ip, $depth)
{
$arr_in = $arr_ip;
$posterity = array();
$tree_ip = array();
$i = 0;
$depth++;
$yan = array();
foreach ($arr_stem as $key => $value)
{
$posterity = get_child($arr_child = $arr_ip, $s_name = $value);
$tree_ip = get_stem($arr_stem = $posterity, $arr_ip = $arr_in, $depth);
$yan[$i]['s_name'] = $value;
$yan[$i]['depth'] = $depth;
$yan[$i]['child'] = $posterity;
$yan[$i]['a_tree'] = $tree_ip;
$i++;
}
return $yan;
}

// --------------- потомки --------------- >
function get_child($arr_child, $s_name)
{
$j = 0;
$child = array();
// $child[0] = 'потомков нет';
foreach ($arr_child as $key => $value)
{
if($value == $s_name)
{
$child[$j] = $key;
$j++;
}
}

return $child;
}

// --------------- тундра --------------- >
function tree_ip($arr_in)
{
$i = 0;
$arr_out = array();
$posterity = array();
$tree_ip = array();
foreach (get_front($arr_in) as $k => $v)
{
$depth = 0;
$posterity = get_child($arr_child = $arr_in, $s_name = $v);
$tree_ip = get_stem($arr_stem = $posterity, $arr_ip = $arr_in, $depth);
$arr_out[$i]['s_name'] = $v;
$arr_out[$i]['depth'] = $depth; //глубина вложенности
$arr_out[$i]['child'] = $posterity;
$arr_out[$i]['a_tree'] = $tree_ip;
$i++;
}

return $arr_out;
}

$yan = tree_ip($in);
print_r($yan);
echo "<br><br>";

// функция печати
function print_Sub_Arr($array_in, $depth)
{
foreach ($array_in as $k=>$v)
{
echo str_repeat('&nbsp', $depth*10), $k, ' => ', $v, '<br>';
if(is_array($v))
{
$depth++;
print_Sub_Arr($v, $depth);
}
}
}

// печать
print_Sub_Arr($yan, $depth=0);

только 'k_item' не считает, вместо него мерит глубину - 'depth' :)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.