2016-08-19 2 views
-2

Как бы вы преобразовали мономерный массив в многомерный массив в PHP? Предположим, что у вас есть что-то вроде этогоПреобразование мономерного массива PHP в многомерное

$array['breakfast'] = 'milk'; 
$array['meal.firstdish'] = 'pasta'; 
$array['meal.seconddish.maincourse'] = 'veal'; 
$array['meal.seconddish.dressing'] = 'fries'; 
$array['meal.dessert'] = 'pie'; 

И вы хотите, чтобы функция, чтобы превратить его в

$array['breakfast'] = 'milk'; 
$array['meal']['firstdish'] = 'pasta'; 
$array['meal']['seconddish']['maincourse'] = 'veal'; 
$array['meal']['seconddish']['dressing'] = 'fries'; 
$array['meal']['dessert'] = 'pie'; 

Та же функция, конечно, должен преобразовать

$tire['ean'] = '3286347717116'; 
$tire['brand.maker'] = 'BRIDGESTONE'; 
$tire['brand.model.name'] = 'POTENZA'; 
$tire['brand.model.variant'] = 'RE 040 RFT * SZ'; 

в

$tire['ean'] = '3286347717116'; 
$tire['brand']['maker'] = 'BRIDGESTONE'; 
$tire['brand']['model']['name'] = 'POTENZA'; 
$tire['brand']['model']['variant'] = 'RE 040 RFT * SZ'; 

I думал об использовании взрыва, а затем оценивал результаты, но eval всегда чувствует, как обманывать меня, и я думаю, что это не позволит моему коду работать в HipHop.

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

+0

Пожалуйста, измените код. Вам не хватает много. Посмотрите на _ ['meal.firstdish] _ должен быть _ [' meal.firstdish '] _, а также _ [' meal '] [' firstdish] _ –

+1

Кроме того, что вы пробовали? – Epodax

+0

Как я уже сказал, я думал, что буду делать a while (list ($ keys, $ value) = each ($ array)) { \t $ individualKeys = explode ('.', $ Keys); \t eval ("\ $ newarray ['". Implode ("'] ['", $ individualKeys). "'] = '$ Value';"); \t} ' –

ответ

0

Как это:

function build(array &$trg, array $k,$key,$value) { 
    $p = &$trg; 
    while (!empty($k)) { 
     $nk = array_shift($k); 
     if (!isset($p[$nk])) { 
      $p[$nk] = []; 
     } 
     $p = &$p[$nk]; 
    } 
    $p[$key] = $value; 
    return $p; 
} 

$array['breakfast'] = 'milk'; 
$array['meal.firstdish'] = 'pasta'; 
$array['meal.seconddish.maincourse'] = 'veal'; 
$array['meal.seconddish.dressing'] = 'fries'; 
$array['meal.dessert'] = 'pie'; 

$out = []; 
foreach ($array as $key => $value) { 
     $path = explode('.',$key); 
     $last = array_pop($path); 
     build($out,$path,$last,$value); 
} 

print_r($out); 
+0

Зачем нужно использовать этот код? ** Хороший ответ ** всегда будет объяснять, что было сделано и почему это было сделано таким образом, не только для OP, но и для будущих посетителей SO. –

+0

Спасибо, @cske, за компактный и элегантный код –

0

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

<?php 
$array['breakfast'] = 'milk'; 
$array['meal.firstdish'] = 'pasta'; 
$array['meal.seconddish.maincourse'] = 'veal'; 
$array['meal.seconddish.dressing'] = 'fries'; 
$array['meal.dessert'] = 'pie'; 

$result = []; 
$target = null; 

foreach ($array as $key => $value) { 
    // Start by targeting the base of our resulting array 
    $target =& $result; 

    // Break the keys apart into pieces 
    $keyParts = explode('.', $key); 

    // Assign new target based on indexing into the result array one "piece" at a time 
    while ($part = array_shift($keyParts)) { 
     $target =& $target[$part]; 
    } 

    // Finally, assign the value to our target 
    $target = $value; 
} 

См https://eval.in/625627

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