2015-10-16 3 views
3

Я пытаюсь присвоить значение массива динамического именем я пытаюсь следующимPhp имя динамического массива

$arr = array(); 

$path = 'arr'."['item']['abc']"; 

${$path} = array(
     'name'=>'somename', 
     'other'=>'...' 
); 

не ${$path} => $arr['item']['abc'];

я также попытался $$path, которые должны оцениваться, как $arr['item']['abc'];, но ни один из них работая

http://codepad.viper-7.com/Dc8Jei

Обновлено ->http://codepad.viper-7.com/k4sIgJ


То, что я пытаюсь сделать, это хранить файлы и папки в массиве У меня есть структура каталогов, как этот

(это амазонки AWS s3 объект ключи)

aaa/aaab/ 
    aaa/a.png 
    aaa/abc/one.png 

    abb/a/ 
    abb/some/ 
    abb/some/ac.png 

теперь я пытаюсь сохранить эти элементы в массиве

Я сломал эти ключи в эту строку, как

['aaa']['abc'] 

теперь, что я хочу, чтобы это

[aaa]{ 
    [aaab]{} 
    [abc]{ 
     [0]{one.png} 
    } 
    [aaab]{} 
} 

его только для иллюстрации

+3

Это не переменные переменные. – Rizier123

+0

@ Rizier123 Не могли бы вы рассказать мне, как это работает http://codepad.viper-7.com/OkcLdz? –

+0

@Uchiha Я просто хочу назначить массив '$ arr ['item'] ['abc']', но я не могу его статически –

ответ

0

Менее weired подход, чем переменных величин было бы построить правильную структуру:

<?php 

$arr = array(); 

$loc_arr = array(
    'item' => array(
      'abc', 
      'www', 
      'ccc'), 
    'other item' => array(
      'other index' 
    ) 
); 

foreach($loc_arr as $item => $scndLevel){ 
    foreach ($scndLevel as $level) { 
     $arr[$item][$level] = array(
      'name'=>'somename', 
      'other'=>'...' 
     ); 
    } 
} 

print_r($arr); 

Печатается:

Array 
(
    [item] => Array 
     (
      [abc] => Array 
       (
        [name] => somename 
        [other] => ... 
       )  
      [www] => Array 
       (
        [name] => somename 
        [other] => ... 
       ) 
      [ccc] => Array 
       (
        [name] => somename 
        [other] => ... 
       )  
     ) 
    [other item] => Array 
     (
      [other index] => Array 
       (
        [name] => somename 
        [other] => ... 
       )  
     )  
) 

UPDATE:

Вы должны рассмотреть рекурсивная функция при перемещении каталогов а не процедурный подход:

Псевдо код:

dir = array(); 

function traverse(dir) 
{ 
    foreach (direntry as filename) { 
     if (filename is a sub directory) { 
      dir[filename] = array(); 
      traverse(dir[filename]); 
     } else { 
      dir[] = filename; 
     } 

} 
dir['/'] = array(); 
traverse(dir['/']); 

Вот только, чтобы дать вам идею и отправную точку, это не работает код.

+0

Это фактическая проблема. Я не могу исправить количество ключей :(пожалуйста, уточните обновленный вопрос. –

+0

. Ваш подход к перемещению каталогов S3 может стоить внимания. Это, вероятно, пахнет задачей для рекурсии, а не странных алгоритмов. –

+0

Я попробовал рекурсию, но amazon aws s3 не предоставляет структуру папок, где все, что мы получаем, это массив, похожий на http://pastebin.com/mNHNNyUE, поэтому я не могу применить рекурсию, как вы можете видеть –

2

Я думаю, что вы действительно должны рассмотреть возможность использования ссылок вместо $$, как это:

$arr = array(); 

$path = &$arr['item']['abc']; 

$path[] = array(
     'name'=>'somename', 
     'other'=>'...' 
); 

print_r($path); 

EDIT: Еще один вариант, основанный на новых деталях, полученных от автора:

Давайте рассмотрим случай, когда индексы хранятся в отдельном массиве, «динамически», как вы его называете. Индекс «item» всегда одинаков - давайте просто опустим его.

$arr = array(); 

//Throwing out the 'item' index, leave only the important keys here 
$loc_arr = array("abc","www","ccc"); 

foreach($loc_arr as $item){ 
    $arr['item'][$item] = array(
     'name'=>'somename', 
     'other'=>'...' 
    ); 
} 

print_r($arr); 

И даже если элемент «элемент» не будет иметь такое же имя, все время - вы можете использовать 2 измерения, чтобы указать правильный. Добавьте некоторую рекурсивную функцию, и она будет перебирать предмет и задавать значения соответственно. Еще один вариант для вас.

$loc_arr = array('item' => array('abc','www','ccc'), 'foo' => array('bar', 'bar2')); 
+0

Да. Я буду поддерживать всех, кто предлагает нечто разумное вместо безумия, которое является переменными переменными. – Simba

+0

'['item'] ['abc']' не является статическим, его динамическая проверка http://codepad.viper-7.com/k4sIgJ –

+3

Как обычно: если 'eval' является ответом, вы, вероятно, задаете неправильные вопросов. –

3

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

Вот один из возможных вариантов:

<?php 

$arr = array(); 

$loc_arr = array('item' => array('abc', 'www', 'ccc')); 

foreach($loc_arr as $itemKey=>$items){ 
    foreach($items as $subitem) { 
    $arr[$itemKey][$subitem] = array(
     'name'=>'somename', 
     'other'=>'...' 
    ); 
    } 
} 

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

Переменные переменные следует учитывать так же, как eval(): Избегайте использования их там, где это возможно. Если вы обнаружите, что хотите их использовать, вы, вероятно, приближаетесь к вещам не под углом. Они существуют, потому что они могут быть полезны в некоторых случаях, но эти случаи очень редки. Я пишу PHP как профессиональный разработчик уже более десяти лет, и я не помню, как в прошлый раз я даже приблизился к необходимости использовать их.

+0

ни я , пожалуйста, проверьте обновленный вопрос –

+0

Я пытаюсь создать ассоциативный массив этим http://pastebin.com/mNHNNyUE –

+0

Re обновленный вопрос: как вы получаете эту папку strucutre в первую очередь? – Simba