2011-01-06 2 views
1

Есть ли лучший способ получить тот же результат, который это производит?Лучший способ сделать это foreach в PHP?

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

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

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

+0

определить «лучше» –

+17

http://www.google.com/search?client = safari & rls = en & q = define: + Better & ie = UTF-8 & oe = UTF-8 –

+3

@ Кевин Браун: -неплодные аплодисменты – BoltClock

ответ

2

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

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

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

+0

+1 Хорошая идея о создании выделенного метода «getIDArray». –

+0

Могу я подглядывать? При желании определенного массива объекта, является ли наилучшим методом foreach? –

+0

Да, определенно. Разработка: она легко читается разработчиком, и в большинстве случаев она отлично работает. –

1

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

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

+0

Ну, я полный php noob, обучая себя ... поэтому я не совсем понимаю, как работают параметры, методы, объекты и т. Д. –

+0

Я попробовал метод 'result_array()', но это не сработало ... Я просто пытаюсь получить массив id из массива «report», вот и все ... –

1
$array = array_map(function($k) { 
    return $k['id']; 
}, $data['report']->result_array()); 

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

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

Редактировать: Удалено бит о сравнении скорости.

+1

Я не спускал вниз, но это определенно не быстрее, ни короче, ни легче читать, и т. Д. :) – webbiedave

+0

@Col. Шрапнель, ха-ха. Я тестировал, и 'array_map' определенно медленнее для этого тривиального цикла. @webbiedave, учитывая синтаксис PHP, я согласен. – Matthew

+0

не быстрее и медленнее. это просто равно.для небольших объемов данных, обработанных в 99,999% наших сценариев, это совершенно незначительно. И если вам приходится обрабатывать большой объем данных, вам нужно найти место для оптимизации до того, как вы достигнете этой уродливой петли –

1

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

$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); 

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

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