2012-06-11 2 views
1

Я знаю, что http_build_query() и parse_str() - лучшее решение для такого рода проблем, но я не могу изменить структуру данных в конкретном проекте, над которым я работаю, поэтому я пытаясь упростить некоторые вещи, создав большие трехмерные ассоциативные массивы из хранимой строки базы данных.Создание пользовательской функции php «explode» recursive

Может кто-нибудь, пожалуйста, дайте мне руку, делая эту функцию рекурсивной? Я хочу, чтобы взять что-то вроде этого:

explode3D($separators = array('|',','), 
$string = "val1,val2|val1,val2,val3", 
$keys = "cat1,item1,item2|cat2,item1,item2,item3" 
); 

И вернуть что-то вроде этого

Array (
'cat1' => Array('item1'=>'val1', 'item2'=>'val2'), 
'cat2' => Array('item1'=>'val1', 'item2'=>'val2', 'item3'=>'val3') 
) 

Вот функция до сих пор:

function explode3D($separators,$string,$keys=0){ 
    $res = array(); 

    if(is_array($separators)){//MULTI DIMENSION MODE: (unfinished!!) 

     //help needed here// 

    }else{//SINGLE DIMENSION MODE: 
     $vals = explode($separators,$string); 
     if($keys === 0){ //NO KEYS: 
      $res = $vals; 
     }else if($keys === 1){//ALTERNATE ROWS ARE KEYS: 
      $key = ''; 
      for($i=0; $i<sizeof($vals); $i++){ 
       if ($i++ % 2 == 1){ //every second element: 
        $key = $vals[$i]; //save the key 
       }else{ 
        $res[$key] = $vals[$i]; //set the saved key = value 
       } 
      } 
     }else{ //GET KEYS FROM $keys ARRAY: 
      if(is_string($keys)){ //explode keys string if necessary (using $separators) 
       $keys = explode3D($separators,$keys); 
      } 
      for($i=0; $i<sizeof($vals); $i++){ 
       $res[$keys[$i]] = $vals[$i]; 
      } 
     } 
    } 
    return($res); 
} 
+0

В чем проблема? – powtac

+0

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

+0

Извините, обновил вопрос на примере. – cronoklee

ответ

0

Вот идея, как она должна работать. Я считаю, что существует небольшое количество опечаток и пропущенных операторов, но, надеюсь, он поможет вам понять, как это сделать.

<?php 
$string = "val1,val2|val1,val2,val3"; 
$keys = "cat1,item1,item2|cat2,item1,item2,item3"; 

$firstDimension = explode("|", $keys); 
$firstDimensionValues = explode("|", $string); 
$newArray = Array(); 
for($i = 0; $i < count($firstDimension); $i++) 
{ 
    $d2Keys = explode(",", $firstDimension[$i]); 
    $key = $d2Keys[0]; 
    array_shift($d2Keys); // remove $key 
    $d2Values = explode(",", $firstDimensionValues[$i]); 
    for ($a = 0; $a < count($d2Keys); $a++) 
    { 
    $newArray[$key][$d2Keys[$a]] = $d2Values[$a]; 
    } 
} 

print_r($newArray); 
+0

@cronoklee проверен, очищен синтаксис. Не стесняйтесь задавать вопросы –

+0

Прохладный Я надеялся, что динамики разделителей (перечислены в массиве $ separators), но это хорошая отправная точка. Благодаря pyrate – cronoklee

Смежные вопросы