2015-07-22 2 views
2

Я пытаюсь найти функцию, которая строит многомерный массив после взрыва.PHP Встроенный многомерный массив после функции разрыва

Например: Здесь я создаю массив с таким же взрывом.

$str = 'root/foo/bar/file.jpg'; 
$ar = explode('/', $str); 

$ ар => Array ('корень', 'Foo', 'бар', 'file.jpg');

Тогда я хочу это:

выводе
array(3) { 
    ['root']=> 
     ['foo']=> 
      ['bar']=> "file.jpg" 
} 

Любая идея?

Thx

+3

это не так, как взрываются работы. он берет строку и создает массив SINGLE с несколькими записями, представляющими части того, что вы взорвали. он не «идет вниз» для вас. –

+0

@MarcB верен, как только вы взорвете строку, вы завершите работу с одним массивом и сделаете ее многомерной, вам придется написать свою собственную функцию. Если вы хотите продолжить этот вариант, мы будем более чем рады помочь вам на этом пути. –

+1

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

ответ

0
<?php 

$str = 'root/foo/bar/file.jpg'; 
//Get last part of the filename 
$parts = explode('/', $str); 
$last = array_pop($parts); 

$arr = []; 
//Create code as string to fill in array 
$codeParts = implode("']['", $parts); 
$codeEx = "\$arr['{$codeParts}'] = \$last;"; 

eval($codeEx); 

var_dump($arr); 

https://eval.in/403480

Выход:

array(1) { 
    ["root"]=> 
    array(1) { 
    ["foo"]=> 
    array(1) { 
     ["bar"]=> 
     string(8) "file.jpg" 
    } 
    } 
} 
+5

Хотя изобретательность с использованием eval здесь, вероятно, плохая идея – Orangepill

+0

С помощью этого точного кода я не вижу, как это может быть вредно. Если OP не имеет контроля над строками, которые взорваны или есть больше информации, то да, это может вызвать проблемы. Можно использовать ссылку на опасность eval. – Jessica

+0

Как насчет того, чтобы не использовать eval ни по какой другой причине, кроме как вам не нужны дополнительные накладные расходы, чтобы присвоить элементу массива значение? – cspray

1

Вот один из способов, что эта проблема может подойти.

<?php 

$str = 'root/foo/bar/file.jpg'; 

$parts = explode("/", $str); 
$leaf = array_pop($parts); 
$tree = array(); 
$branch = &$tree; 
foreach($parts as $v){ 
    $branch[$v] = array(); 
    $branch = &$branch[$v]; 
} 
$branch = $leaf; 

print_r($tree); 

Попробуйте сами here

+0

Действительно, как ваш ответ, но я думаю, вы сделали небольшую опечатку. '$ branch [$ v] = $ leaf;' должно быть '$ branch = $ leaf;' – PHPhil

+0

@PHPhil спасибо поймали и исправили его в ссылке 3v4l, но не в ответе. – Orangepill

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