Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Распарсить массив строк


Автор: Guedda 25.12.2012, 13:07
Добрый день, уважаемые.
Столкнулся со следующей проблемой.
Есть, допустим, массив:
Цитата

array(5) {
  [0] => "ACTION.MONDAY.235.4141",
  [1] => "ACTION.MONDAY.235.3737",
  [2] => "ACTION",
  [3] => "ACTION.MONDAY",
  [4] => "ACTION.TUESDAY.112.2345",
  [5] => "ACTION.TUESDAY.456.7842",
}

На выходе мне необходимо получить следующий массив:
Цитата

$arr['ACTION']['MONDAY']['235']['4141'] = "";
$arr['ACTION']['MONDAY']['235']['3737'] = "";
$arr['ACTION']['TUESDAY']['112']['2345'] = "";
$arr['ACTION']['TUESDAY']['456']['7842'] = "";

Тобишь, чтобы результирующие ключи были подстроками, через точку.
Надеюсь подробно объяснил. И вот сижу, ничего мудрого придумать не могу. Задача осложняется тем, что в строке может быть сколь угодно много разделений (прим.: "ACTION.MONDAY.235.3231.12551.1.234.231", и на выходе должно получиться $arr['ACTION']['MONDAY'][235][3231][12551][1][234][231]) 
Как-то так.
Может кто уже сталкивался с таким и есть готовое решение? Просто уже всю предновогоднюю голову сломал, так и не нахожу решения.

Заранее благодаре за ответы.

Автор: StachelDraht 25.12.2012, 13:10
explode() ????

Автор: Guedda 25.12.2012, 13:13
Цитата(StachelDraht @  25.12.2012,  14:10 Найти цитируемый пост)
explode() ???? 

explode создает массив типа такого:
Цитата

[0] => "ACTION"
[1] => "MONDAY"

и так далее...
Поэтому мне не очень подходит. Или приведите пример? А то я не очень понимаю.

Автор: ksnk 25.12.2012, 13:32
Цикл по исходному массиву, explode значения, цикл по результату эксплода и складировать все в массив. Какие такие готовые решения?  smile 

Автор: Guedda 25.12.2012, 13:36
Цитата(ksnk @  25.12.2012,  14:32 Найти цитируемый пост)
Цикл по исходному массиву, explode значения, цикл по результату эксплода и 

До этого я допетрил и сам )))) а вот:
Цитата(ksnk @  25.12.2012,  14:32 Найти цитируемый пост)
складировать все в массив

Даже не представляю, что делать smile Ну подскажи, я знаю - ты умный.

Цитата(ksnk @  25.12.2012,  14:32 Найти цитируемый пост)
Какие такие готовые решения?   

Имеется ввиду, может кто уже такое делал, и у него где-нибудь наработки остались.
У меня в данном случае есть следующее:
Код

foreach ($list as $list_element) {
    $arr = array();
    $tmp_res = explode(".", $list_element);
    foreach ($tmp_res as $value) {
       // и вот здесь что делать, ума не приложу. :)
    }
}

Автор: baldina 25.12.2012, 14:18
Код

foreach ($list as $list_element) {
    $arr = array();
    $tmp_res = explode(".", $list_element);
    $tmp_arr = &$arr;
    foreach ($tmp_res as $value) {
       $tmp_arr[$value] = "";
       $tmp_arr = &$tmp_arr[$value];
    }
}


Добавлено через 52 секунды
если данные надежные проще и короче eval

Добавлено через 5 минут и 18 секунд
только $arr = array(); нужно вынести наружу, ведь итоговый массив должен быть один

Автор: ksnk 25.12.2012, 14:40
Код

$list = array (
    "ACTION.MONDAY.235.4141",
    "ACTION.MONDAY.235.3737",
    "ACTION",
    "ACTION.MONDAY",
    "ACTION.TUESDAY.112.2345",
    "ACTION.TUESDAY.456.7842",
);

$arr = array();
    
foreach ($list as $list_element) {
    $tmp_res = explode(".", $list_element);
    $cur=&$arr;
    if(count($tmp_res )>0){
        $last=array_pop($tmp_res );
        if(count($tmp_res )>0){
           foreach ($tmp_res as $value) {
              //$cur - array!
              if(!array_key_exists($value,$cur) || ''===$cur[$value])
                 $cur[$value]=array();
              $cur=&$cur[$value];
           }
        } 
        if(!array_key_exists($last,$cur))
              $cur[$last]='';
    }
    unset($cur);
}
echo "<pre>";
var_export($arr );

Автор: Guedda 25.12.2012, 14:48
Цитата(baldina @  25.12.2012,  15:18 Найти цитируемый пост)
только $arr = array(); нужно вынести наружу, ведь итоговый массив должен быть один 

Вынес наружу, но результат только по последней строке в массиве получается.
Цитата

array(1) {
  ["ACTION"]=>
  array(1) {
    ["TUESDAY"]=>
    array(1) {
      [456]=>
      array(1) {
        [7842]=>
        &string(0) ""
      }
    }
  }
}

Вот код:
Код

$arr = array();
foreach ($list as $list_element) {
    $tmp_res = explode(".", $list_element);
    $tmp_arr = &$arr;
    foreach ($tmp_res as $value) {
       $tmp_arr[$value] = "";
       $tmp_arr = &$tmp_arr[$value];
    }
}
var_dump($arr);

Автор: baldina 25.12.2012, 15:22
ну да, накосячил... данные заменяются. надо так:
Код

$arr = array();
foreach ($list as $list_element) {
    $tmp_arr = &$arr;
    foreach (explode(".", $list_element) as $value) {
       if (!isset($tmp_arr[$value]))
         $tmp_arr[$value] = "";
       $tmp_arr =& $tmp_arr[$value];
    }
}

Автор: Guedda 25.12.2012, 15:47
Супер, спасибо огромное! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)