2010-01-31 3 views
2

Как отправить имя индекса для php-массива vairable.PHP-массив как имя переменной

массив

$array = array('Somthing'=>array('More'=>array('id'=> 34))); 

и теперь я хочу, чтобы отобразить эту вещь, но с именем переменной я не знаю, как объяснить, так что я пишу то, что я хочу иметь.

$index_name = '[Something][More][id]'; 

$array{$index_name}; 

Возможно ли это каким-либо образом?

+0

Это должно быть возможно с помощью регулярных выражений. Но это не было бы очень эффективным или гибким для изменения. – Tammo

+0

Кстати, у вас есть опечатка в вашем исходном коде. Вы определяете ключ в $ массиве под названием «Somthing», но затем пытаетесь ссылаться на него позже, называя его «Кое-что». –

+0

Не пропустите действительные ответы на этот вопрос, которые делают это очень просто, используя eval(). Важно обсудить лучшие практики SO, но это глупо, когда мы игнорируем действительные и простые решения проблем только потому, что считаем, что мы знаем ситуацию лучше, чем OP. Приветствия. –

ответ

15

Не в один ход. Вот как вы могли бы сделать это:

$array['Something']['More']['id'] 

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

function array_multi(Array $arr, $path) { 
    $parts = explode(".", $path); 

    $curr =& $arr; 
    for ($i = 0, $l = count($parts); $i < $l; ++$i) { 
     if (!isset($curr[$parts[$i]])) { 
      // path doesn't exist 
      return null; 
     } else if (($i < $l - 1) && !is_array($curr[$parts[$i]]) { 
      // path doesn't exist 
      return null; 
     } 
     $curr =& $curr[$parts[$i]]; 
    } 
    return $curr; 
} 

// usage: 
echo array_multi($array, "Something.More.id"); // 34 
echo array_multi($array, "Something.More");  // array("id" => 34) 
+0

+1 Мне очень нравится этот ответ :) –

1

Вы могли бы сделать это с eval() :

<?php 

$array = array('Somthing'=>array('More'=>array('id'=> 34))); 
$index_name = "['Somthing']['More']['id']"; 

$stmt='echo $array'.$index_name.';'; 
eval($stmt); 

?> 

UPDATE:

Кажется, что некоторые пользователи SO неудобны с идеей использования eval(). Я думаю, что имеет смысл read this thread which discusses the pros and cons, прежде чем решать, использовать ли это в своем собственном коде.

+2

Если вы собираетесь потратить время, чтобы уменьшить мой ответ, комментарий наверняка будет приятным. –

+1

Я бы предположил, что это связано с использованием eval(). Я не был тем, кто мог бы сделать это. –

+2

И конкретно, что относительно использования eval()? Он выполняет то, что OP хочет сделать. –

1

Хорошо, я знаю, что люди стреляют. Но c'mon, eval() не всегда неправильный ответ.

$array = array('Something'=>array('More'=>array('id'=> 34))); 
$index_name = '[Something][More][id]'; 
eval('$val = $array'.$index_name.';'); // Wrap in a function or something 
+0

Это прекрасный пример того, почему это неправильно. у вас есть синтаксическая ошибка в вашей ** строке **. кто, черт возьми, хочет отлаживать код, который генерируется «на лету»? – nickf

+0

, что код работает без проблем, поэтому я не знаю, где предположительная ошибка синтаксиса. если вы, однако, обращаетесь к отсутствующим котировкам на индексных ключах, я согласен, что это уродливо, но это не так. php оценивает все неопределенные константы в своих строковых значениях, и я просто сокращаю из op. –

2

Рекурсивная версия поддерживает синтаксис с квадратными скобками:

$array = array('Something'=>array('More'=>array('id'=> 34))); 

$string = '[Something][More][id]'; 

echo scan_array($string, $array); 

function scan_array($string, $array) { 
    list($key, $rest) = preg_split('/[[\]]/', $string, 2, PREG_SPLIT_NO_EMPTY); 
    if ($key && $rest) { 
     return scan_array($rest, $array[$key]); 
    } elseif ($key) { 
     return $array[$key]; 
    } else { 
     return FALSE; 
    } 
} 
1

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

function key_path($arr, $keys) { 
    return $keys ? key_path($arr[array_shift($keys)], $keys) : $arr; 
} 

$arr['Something']['More']['id'] = 34; 
$keys = array('Something', 'More', 'id'); 

var_dump(key_path($arr, $keys)); 
Смежные вопросы