Путь к массиву из переменной в PHP - PullRequest
0 голосов
/ 28 апреля 2011

Итак, я написал класс, который может анализировать XML-документы и создавать из него SQL-запросы для обновления или вставки новых строк в зависимости от настроек.

Поскольку скрипт должен работать с любым количеством вложенных блоков, массив, в который я помещаю все значения, имеет динамически созданный путь, как в следующем примере:

$path = array('field1','field2');
$path = "['".implode("']['",$path)."']";

eval("\$array".$path."['value'] = 'test';");

В основном $path содержит массив, который показывает, насколько глубоко мы сейчас находимся в массиве, если $path содержит, например, значения main_table и field Я хочу установить $array['main_table']['field']['value'] в 'test'

Как вы видите, я сейчас использую eval для этого, и это прекрасно работает. Мне просто интересно, есть ли способ сделать это без использования eval.

что-то вроде $array{$path}['value'] = 'test'; но потом что-то, что действительно работает.

Есть предложения?

EDIT

Причина, по которой я ищу альтернативу, в том, что я считаю, что eval - плохая практика.

ВТОРОЕ РЕДАКТИРОВАНИЕ

Изменил фактический код на фиктивный, потому что он вызывал много недоразумений.

Ответы [ 3 ]

3 голосов
/ 28 апреля 2011

Используйте что-то вроде этого:

/**
 * Sets an element of a multidimensional array from an array containing
 * the keys for each dimension.
 * 
 * @param array &$array The array to manipulate
 * @param array $path An array containing keys for each dimension
 * @param mixed $value The value that is assigned to the element
 */
function set_recursive(&$array, $path, $value)
{
  $key = array_shift($path);
  if (empty($path)) {
    $array[$key] = $value;
  } else {
    if (!isset($array[$key]) || !is_array($array[$key])) {
      $array[$key] = array();
    }
    set_recursive($array[$key], $path, $value);
  }

}

1 голос
/ 28 апреля 2011

Вы можете обойти весь бизнес счетчиков с помощью оператора добавления массива:

$some_array[] = 1; // pushes '1' onto the end of the array

Что касается всего бизнеса пути, я предполагаю, что это в основном странное представление xpath-подобного маршрута через ваш xmlдокумент ... есть ли причина, по которой вы не можете просто использовать эту строку как ключ массива?

$this->BLOCKS['/path/to/the/node/you're/working/on][] = array('name' => $name, 'target' => $target);
0 голосов
/ 06 мая 2018

Вы можете использовать foreach с переменными переменными .

// assuming a base called $array, and the path as in your example:
$path = array('field1','field2');

$$path = $array;
foreach ($path as $v) $$path = $$path[$v];
$$path['value'] = 'test';

Коротко, просто и намного лучше, чем eval.

...