2012-06-06 2 views
2

Допустим, у меня есть следующий многомерный массив:Как использовать переменную для решения сложных ассоциативных массивов в PHP

$fruits['apple']['name'] = 'macintosh'; 

Есть ли способ ссылки на весь ключевой путь в одной переменной?

Я хотел бы, чтобы каким-то образом сделать следующее:

$path = "['apple']['name']"; 
echo $fruits[$path]; 

//output would be "macintosh" 
+0

и ссылки приходит на ум .. –

+0

@vizvi Можете ли вы расширить немного по этому поводу? Благодарю. –

+0

Вы можете позвонить: $ fruits2 = & fruits ['apple']; echo $ fruits2 ['name']; даст вам «macintosh» –

ответ

3

Есть ли способ ссылки на весь ключевой путь в одной переменной?

1) В некотором смысле, как это: $fruits[$variable], ответ нет, не.

Конечно, есть несколько способов, вы можете разделить один переменный $ в два или более, а затем использовать его часть separetely ($fruits[$part1][$part2])

Это общее решение:

function get_path($array, $path) 
{ 
    $value = $array; 
    $parts = explode("']['", trim($path, "[']")); 
    foreach($parts as $key) 
    { 
     $value = $value[$key]; 
    } 
    return $value; 
} 

$fruits['apple']['name'] = 'macintosh'; 
$path = "['apple']['name']"; 
echo get_path($fruits, $path); 

// output = 'macintosh' 

2) Как отметил также, вы можете использовать "Eval", который не рекомендуется:

$fruits['apple']['name'] = 'macintosh'; 
$path = "['apple']['name']"; 
eval('echo $fruits' . $path . ';'); 

// output = 'macintosh' 

3) Наконец, если вы хотите получить доступ к элементу массива с помощью ссылочной переменной, а затем просто:

$fruits['apple']['name'] = 'macintosh'; 
$path &= $fruits['apple']['name']; 
echo $path; // output = 'macintosh' 

$path = 'MSX'; 
echo $fruits['apple']['name']; // output = 'MSX' 
0

литературы может быть то, что вам нужно:

$path = &$fruits['apple']['name']; 

Теперь каждый раз, когда вы будете получать доступ к $path, это значение $fruits['apple']['name'], которое будет использоваться (или изменено и т. Д.).

+0

Спасибо. Я думаю, что это самый многообещающий ответ на мой случай. –

0

То, что вы хотите сделать, прямо не возможно - было бы неопределенным, если бы переменные были скованы цепью.

Вам нужно будет написать функцию доступа, такие как

define('SEPARATOR','|'); 

function getElement($array,$path) { 
    $path=explode(SEPARATOR,$path); 
    $out=&$array; 
    foreach ($path as $step) { 
    if (!isset($out[$step])) return null; 
    $out=$out[$step]; 
    } 
    return $out; 
} 

$path="apple|name"; 
echo getElement($fruits,$path); 
1

Существует, очевидно, что попало, никогда к не быть используемый подход: eval()

Но если вы действительно хотите сделать что-то вроде это, я предпочел бы что-то вроде этого подхода:

function &array_value_by_address (&$array, $address, $addressSeparator = '/') { 
    $parts = explode($addressSeparator, $address); 
    $thisLevel = array_shift($parts); 
    if (isset($array[$thisLevel])) { 
    if ($parts) { 
     $ref = &array_value_by_address($array[$thisLevel], implode($addressSeparator, $parts)); 
     return $ref; 
    } else { 
     return $array[$thisLevel]; 
    } 
    } 
} 

из-за ссылок в объявлении функции, это также можно поймать возвращение VAL ue в переменной и использовать ее для изменения исходного массива. Это необязательно - если вы опустите префикс & во время разговора, пойманное значение будет просто копией, а не ссылкой.

Предостережение - функция вернет NULL, если «адрес» внутри массива не существует, но нет возможности различать эту ситуацию и значение NULL, хранящееся в массиве.

See it working

1

J Brun в # 3 ответе является лучшим выбором, однако, его ответ не является правильным, поскольку он продемонстрировал побитовое-И оператор (& =), а не ссылочное назначение. Это исправленный код:

$fruits['apple'] = array('name' => 'macintosh'); 

$path = &$fruits['apple']['name']; 

echo $path; // outputs 'macintosh'; 
Смежные вопросы