|
 630 байт |
|
| Здравствуйте!
помогите разобрать многомерный массив.
есть массив вида:
Array
(
[0] => 1
[1] => 11
[2] => 12
[3] => 2
[4] => 21
[5] => 211
[6] => 212
[7] => 213
[8] => 214
[9] => 22
[10] => 23
[11] => 24
[12] => 3
[13] => 31
[14] => 32
)
|
а необходимо:
Array
(
[1] => Array
(
[11] => 11
[12] => 12
)
[2] => Array
(
[21] => Array
(
[211] => 211
[212] => 212
[213] => 213
[214] => 214
)
[22] => 22
[23] => 23
[24] => 24
)
[3] => Array
(
[31] => 31
[32] => 32
)
)
|
мой вариант смотрите во вложении! | |
|
|
|
|
|
|
|
для: freeing
(22.06.2009 в 01:03)
| | ..третий день уже сижу, даже не знаю что и делать (
изначально задача мне показалась легкой, однако на практике.. (
подскажите где моя ошибка, может я вообще не так разбираю! | |
|
|
|
|
|
|
|
для: freeing
(22.06.2009 в 03:12)
| | Нормальные имена переменным придумывать не стал - так как не понятно для какой цели нужна функция. Кроме того она будет бажить если в массиве окажутся элементы с одинаковым значением (я незаметил что в изначальном массиве индексы идут по порядку, из-за этого скрипт делает кучу левой работы. которая при большом объеме массива должна сильно сказаться на быстродействии). Ну и она не привязанна к цифрам - массив может быть и из букв.
<?php
$arr1 = array
(
0 => 1,
1 => 11,
2 => 12,
3 => 2,
4 => 21,
5 => 211,
6 => 212,
7 => 213,
8 => 214,
9 => 22,
10 => 23,
11 => 24,
12 => 3,
13 => 31,
14 => 32
);
function doit($array, $len = 1, $poss = 0)
{
$z = 0;
foreach ($array as $arr)
{
if ($poss != 0)
{
if ($poss == $arr)
{
$poss = 0;
}
else
{
continue;
}
}
if (strlen($arr) == $len)
{
$arr2[$arr] = $arr;
$save = $arr;
$z = 0;
}
elseif (strlen($arr) == $len+1)
{
if ($z == 0)
{
$arr2[$save] = doit($array, $len+1, $arr);
$z = 1;
}
}
elseif (strlen($arr) < $len)
{
break;
}
}
return $arr2;
}
$arr2 = doit($arr1);
print '<pre>';
print_r($arr2);
?>
|
| |
|
|
|
|
|
|
|
для: Гость
(22.06.2009 в 10:18)
| | ..спасибо конечно, но по пойму это очень грубовато, есть над чем по работать )..
пересплю с этим! и сброшу свой вариант ) | |
|
|
|
|
|
|
|
для: freeing
(22.06.2009 в 14:07)
| | Та поскольку индексы по порядку. втыкать туда for и все. ну и передавать индекс в функцию вместо $poss. Сразу первое условие со всеми его хитросплетениями убирается и все должно работать)
А грубовато - это да. яж написал что незаметил)) | |
|
|
|
|
|
|
|
для: Гость
(22.06.2009 в 14:48)
| | а возможно ли не в функции а в цикле реализовать данный вариант?
мне не очень нравиться идея перезагрузки функции, да и текста многовато ) | |
|
|
|
|
|
|
|
для: Гость
(22.06.2009 в 14:48)
| | Может существуют втройные функции для деревовидной сортировки? | |
|
|
|
|
|
|
|
для: freeing
(26.06.2009 в 06:36)
| | Решение проблемы!
$str = array(1,11,12,2,21,211,212,213,214,22,23,24,3,31,32);
$ret = array();
foreach ($str as $v)
{
$p = &$ret;
for ($i = 0; $i++ < strlen($v);)
{
if (!is_array($p))
{
$p = array();
}
$p = &$p[substr($v,0,$i)];
}
if (!is_array($p))
{
$p = $v;
}
}
print "<pre>";
print_r($ret);
|
| |
|
|
|