Лучший способ сделать это foreach в PHP? - PullRequest
1 голос
/ 06 января 2011

Есть ли лучший способ получить тот же результат, что и при этом?

foreach($data['report']->result_array() as $k){
    $array[] = $k['id'];
}

Лучше: в этом контексте, то есть короче, легче для чтения или с лучшим синтаксисом в целом.

Я нуб, поэтому комментарии / предложения / общая мудрость от сообщества программистов приветствуются!

Ответы [ 4 ]

2 голосов
/ 06 января 2011

Я не могу придумать лучшего способа добиться этого.

Конечно, если вы можете изменить функцию result_array (), вы можете ввести новый параметр, который будет возвращать только поле id . Однако, по моему мнению, это снижает читабельность кода.

Если вы хотите загрузить только идентификаторы из $ data ['report'], я бы предложил определить новый специализированный метод, который возвращает все id .

1 голос
/ 06 января 2011

Вот один из лучших способов (по крайней мере, то, что я бы определил, чтобы быть лучше):

$reportIds = array();
$dataArray = $data['report']->result_array();

foreach($dataArray as $reportElement) {
    $reportIds[] = $reportElement['id'];
}

Он использует более значимые имена переменных (как я догадываюсь) и немного более подробный о том, что происходит. Помните, что удобочитаемость превосходит все остальные проблемы, за исключением правильности.

Конечно, в зависимости от потребностей того, что вы делаете, вы также можете написать метод для извлечения только идентификаторов (вдоль стороны result_array()) или итератор, чтобы сделать это для вас:

class MultiDimensionalArrayIterator extends ArrayIterator {
    protected $key = '';

    public function __construct(array $array, $key) {
        $this->key = $key;
        parent::__construct($array);
    }

    public function current() {
        $data = parent::current();
        return $data[$this->key];
    }

    public function offsetGet($index) {
        $data = parent::offsetGet($index);
        return $data[$this->key];
    }

    // Implement other overrides to consistently handle iteration
}

Использование:

$dataArray = $data['report']->result_array();
$iterator = new MultiDimensionalArrayIterator($dataArray, 'id');
$reportIds = iterator_to_array($iterator);

Есть много возможностей. Вопрос в том, что вам нужно, и что нужно остальной части вашего проекта ...

1 голос
/ 06 января 2011
$array = array_map(function($k) { 
    return $k['id'];
}, $data['report']->result_array());

Вы ограничены только тем, что делаете в «цикле», поэтому я не знаю, квалифицируется ли это как «лучше».Это просто по-другому.

Некоторые люди предпочитают стиль программирования map / lower, но в PHP-коде это не очень распространено, поскольку синтаксис не очень хорош, а анонимные функции были введены совсем недавно.1005 * Редактировать: Убран бит о сравнении скорости.

1 голос
/ 06 января 2011

Если вы просто хотите извлечь поле 'id' из массива данных, возвращаемых функцией result_array для каждого элемента $ data ['report'], и поместить его в новый массив, то это, вероятно, примерно какэффективнее, чем вы можете получить.

Есть что-то, что вас беспокоит?Это выглядит хорошо для меня (хотя я бы никогда не назвал переменную массива $ array - что-то вроде $ idArray кажется более подходящим), если с такой структурой объектов / данных вам приходится иметь дело.Тем не менее, я предполагаю, что это правильно прокомментировано и т. Д.

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