Преобразование пути в массив

tamerlan

Новичок
Преобразование пути в массив

Есть две переменные
PHP:
$path = 'abc/def/ghi';
$value = '111';
Нужно получить массив
PHP:
$array['abc']['def']['ghi'] = '111';
Целый день бьюсь над этой логикой.
Буду очень благодарен за разъяснения.
 

Фанат

oncle terrible
Команда форума
ну и что у тебя получилось по итогам дня? какой код?
 

DiMA

php.spb.ru
Команда форума
код - выше :)

с помощью explode разбей строку в массив по /, потом склей в название переменной и через eval реально создай
 

tamerlan

Новичок
Кода пока нет. Может explode по слешу, затем конкатенция значений массивов в строку, с добавлением [' и '], а потом eval строки. Но функция eval не на всех хостингах разрешена.
 

Фанат

oncle terrible
Команда форума
особенно учитывая, что строчка - явно из урла.

-~{}~ 19.02.09 17:51:

функция евал должна быть в голове запрещена, а не на хостинге.
 

tamerlan

Новичок
PHP:
$tmp=&$arr[$part]
А можно поподробнее, а то голова опухла от мышления )))

-~{}~ 19.02.09 18:06:

Есть подозрение, что решение задачи лежит где-то на поверхности и оно достаточно элегантно, но ничего в голову не приходит, кроме евал. А евал, как правильно заметил *****, использовать крайне не рекомендуется.
 

DIS

Новичок
вот что у меня получилось
PHP:
function do_array($array,$value,$tmp) {


  if (!count($array))
   return $value;
  else {

          $keys = array_keys($array);
          $next_key = $keys[0];
          unset($array[$next_key]);
          $tmp[$next_key] = do_array($array,$value,$tmp);
          return $tmp;
   }
  }



$path = 'abc/def/ghi';
$value = '111';

$array = explode("/",$path);

$array = do_array(array_flip($array),$value,array());

print_r($array);
заморочено.. но работает:)
 

tamerlan

Новичок
DIS
Огромное спасибо за ответ и пример кода... Сижу прикручиваю.

-~{}~ 19.02.09 18:32:

array_flip - вот оно решение ))
 

DIS

Новичок
рад помочь.. наверное можно и поэлегантней сделать. и проверочек добавить..
 

Фанат

oncle terrible
Команда форума
Не, а почему бы с конца, действительно, в цикле не собрать?
$a['ghi']=111;
$b['def']=$a;
ну и так далее.
 

riff

Новичок
у меня так
PHP:
$path = 'abc/def/ghi';
$value = '111';
$array = array();
$path = explode("/", $path);
$path = array_reverse($path);
foreach ($path as $p)
{
	$array = array($p=>$array);
	if (empty($array[$p]))
		$array[$p] = $value;
}
echo $array['abc']['def']['ghi'];
---
пока думал дали ответы. *****, даю слово что у вас не списывал.
 

tamerlan

Новичок
riff
Удивительно, но у меня получился принципиально такой же код, тока названия переменных другие :)))
Тож клянусь, что не списывал :)
 

dimagolov

Новичок
*****, а зачем с конца собирать? что мешает сделать это с начала? ссылку на текущий элемент только запоминаешь и в нее новый вставляешь.
 

riff

Новичок
теперь списал :)
PHP:
$path = 'abc/def/ghi';
$value = '111';
$array = array();
$last =& $array;
$path = explode("/", $path);
foreach ($path as $p)
{
    $last[$p] = array();
    $last =& $last[$p];
}
$last = $value;
echo $array['abc']['def']['ghi'];
 
Сверху