2012-04-30 2 views
1

Im ищет немного сложнее вещь :)ссылки на значения в многомерном ассоциативном массиве

У меня есть многомерный массив, как:

$array = array(
    "collection" => "departments", 
    "action" => "find", 
    "args" => array ("_id" => array("$in" => "{{variablename}}")) 
); 

Я хочу иметь ссылку на значение {{VariableName} }, чтобы изменить его позже. Это должна быть рекурсивная функция, потому что я не могу предсказать, где {{variablename}} находится в массиве.

Без рекурсии нет проблем, но я не нашел, как я могу это сделать.

PS: Другие решения для преобразования массива в строку или json и использование replace меня не интересуют. Мне действительно нужна ссылка.

ответ

0

Не очень красиво (также не рекурсивный, что это хорошо), но должно работать:

// Input data 
$array = array(
    "collection" => "departments", 
    "action" => "find", 
    "args" => array ("_id" => array('$in' => "{{variablename}}")) 
); 

// Create a stack 
$stack = array(&$array); 

// Loop until the stack is empty 
while (sizeof($stack) > 0) { 
    // Get the first variable in the stack (by reference) 
    foreach ($stack as &$current) break; 
    // Remove the first variable from the stack (by reference, same as array_shift but array_shift breaks the references) 
    $stack = array_slice($stack, 1); 
    // If the shifted variable is an array 
    if (is_array($current)) { 
     // Add all the array's values to the stack (by reference) 
     foreach ($current as &$value) { 
      $stack[] =& $value; 
     } 
    } 
    // If the shifted variable is the one we want 
    elseif ($current == '{{variablename}}') { 
     // Stop the loop, leaving $current as the reference to the variable we want 
     break; 
    } 
} 
$current = 'test'; 
var_dump($current); 
var_dump($array); 

Пример: http://ideone.com/hEzZk

+0

работает отлично ТНХ. Но я действительно не понимаю, как работает ваш код :), но я подробно рассмотрю – Kakawait

+0

@Kakawait создает структуру данных стека и добавляет к ней свой массив. Затем он повторяется до тех пор, пока стек не станет пустым. Каждая итерация сдвигает верхнюю часть стека (по ссылке), тогда, если сдвинутая переменная является массивом, она выталкивает каждое значение в стек. Или, если переменная является той, которую вы хотите, она прерывает цикл, оставляя текущую переменную ссылкой. Неплохо обновлять, чтобы добавлять комментарии. – Petah

+0

Да, спасибо, я и верю 5 минут, но я ценю ваши комментарии. Наконец, это хорошая идея – Kakawait

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