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

Форум PHP

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

 

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

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

тема: разобрать многомерный массив
 
 автор: freeing   (22.06.2009 в 01:03)   письмо автору
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 в 03:12)   письмо автору
 
   для: freeing   (22.06.2009 в 01:03)
 

..третий день уже сижу, даже не знаю что и делать (

изначально задача мне показалась легкой, однако на практике.. (

подскажите где моя ошибка, может я вообще не так разбираю!

  Ответить  
 
 автор: Гость   (22.06.2009 в 10:18)   письмо автору
 
   для: freeing   (22.06.2009 в 03:12)
 

Нормальные имена переменным придумывать не стал - так как не понятно для какой цели нужна функция. Кроме того она будет бажить если в массиве окажутся элементы с одинаковым значением (я незаметил что в изначальном массиве индексы идут по порядку, из-за этого скрипт делает кучу левой работы. которая при большом объеме массива должна сильно сказаться на быстродействии). Ну и она не привязанна к цифрам - массив может быть и из букв.


<?php
$arr1 
= array
(
     
=> 1,
     
=> 11,
     
=> 12,
     
=> 2,
     
=> 21,
     
=> 211,
     
=> 212,
     
=> 213,
     
=> 214,
     
=> 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);
?>

  Ответить  
 
 автор: freeing   (22.06.2009 в 14:07)   письмо автору
 
   для: Гость   (22.06.2009 в 10:18)
 

..спасибо конечно, но по пойму это очень грубовато, есть над чем по работать )..

пересплю с этим! и сброшу свой вариант )

  Ответить  
 
 автор: Гость   (22.06.2009 в 14:48)   письмо автору
 
   для: freeing   (22.06.2009 в 14:07)
 

Та поскольку индексы по порядку. втыкать туда for и все. ну и передавать индекс в функцию вместо $poss. Сразу первое условие со всеми его хитросплетениями убирается и все должно работать)

А грубовато - это да. яж написал что незаметил))

  Ответить  
 
 автор: freeing   (25.06.2009 в 22:22)   письмо автору
 
   для: Гость   (22.06.2009 в 14:48)
 

а возможно ли не в функции а в цикле реализовать данный вариант?

мне не очень нравиться идея перезагрузки функции, да и текста многовато )

  Ответить  
 
 автор: freeing   (26.06.2009 в 06:36)   письмо автору
 
   для: Гость   (22.06.2009 в 14:48)
 

Может существуют втройные функции для деревовидной сортировки?

  Ответить  
 
 автор: freeing   (26.06.2009 в 15:17)   письмо автору
 
   для: 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);

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

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