Доступ к элементам многомерного массива с функцией - PullRequest
1 голос
/ 08 января 2010

Мне нужна функция с переменным числом аргументов, чтобы получить доступ к элементам многомерного массива. Я сделал так ($ this -> _ config это массив) ...

function item()
{
    if(func_num_args() != 0){
        $config = $this->_config;
        $args = func_get_args();
        foreach($args as $item){
            $config = $config[$item];
        }
        unset($args);
        return $config;
    }
    else throw new Exception('An item index is required.');
}

Есть ли способ сделать лучше? Спасибо всем!

1 Ответ

1 голос
/ 08 января 2010

В своем вопросе вы говорите, что у вас есть многомерный массив, поэтому я так понимаю:

$config = array('foo' => array('bar' => array('baz' => 3)));

Вызов item('foo', 'bar', 'baz') будет проходить до последнего массива и будет возвращаться 3. Еслиэто то, что вы хотите, вы можете просто написать $config['foo']['bar']['baz'] или поместить свои конфиги в ArrayObject и использовать либо запись доступа к массиву, либо $config->foo->bar->baz (хотя все вложенные массивы тоже должны быть ArrayObjects).

Если вы хотите сохранить функцию, вы должны добавить некоторую проверку индекса, прежде чем захватывать его, потому что PHP выдаст Уведомление о неопределенных индексах.Кроме того, почему бы не использовать InvalidArgumentException вместо Exception.Подходит лучше для этого случая.

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

edit после комментариев Теб, я нахожу довольно неловким подход, чтобы заново изобрести доступ к массиву с помощью такого метода.По моему мнению, вы должны либо передать всю конфигурацию или подмножество своим объектам во время создания и позволить им брать все, что им нужно, через обычные методы доступа к массивам.Это позволит отделить ваши объекты от вашего configManager и упростит модификацию на более позднем этапе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...