Как отфильтровать строки массива, чтобы отображались только записи с определенным значением? - PullRequest
0 голосов
/ 22 января 2011

Представьте, что я выполняю 2 запроса каждый к другой базе данных.

Результат запроса из источника # 1 будет сохранен в массиве. Результат запроса из источника # 2 также будет сохранен в массиве.

Записи источника № 2 будут содержать внешний ключ, который может совпадать или не совпадать с конкретными записями в поле идентификатора в источнике № 1.

Так что, если бы я перебрал источник № 1, а затем хотел бы отобразить только записи источника № 2, которые соответствуют идентификатору источника № 1, есть ли в PHP удобная команда, которая позволит мне получить отфильтрованные результаты, которые Я мог бегать один раз каждый раз, когда запускал цикл.

Чего я хотел бы избежать, так это иметь внутри цикла цикл для проверки результата перед определением, должен ли он отображаться (надеюсь, встроенная команда фильтра, если она будет доступна, будет иметь меньше служебных данных).

Есть предложения по командам, которые фильтруют массив в PHP?

Ответы [ 3 ]

0 голосов
/ 22 января 2011

Это зависит от того, для чего вы оптимизируете.

  • Строки кода: используйте array_intersect, как упомянуто Мэттом V (возможно, после некоторой предварительной обработки).
  • Память / производительность:создать словарь (ассоциативный массив), где ключами являются идентификаторы источника # 1.Если проблема связана с памятью, откажитесь от строк после их обработки.Значения могут быть чем угодно, скажем, ИСТИНА.Теперь вы можете отфильтровать массив из источника # 2, используя isset($dict[$id]), который работает почти постоянно.array_filter здесь может быть полезно.
0 голосов
/ 22 января 2011

Строка в данном массиве является либо объектом, либо массивом.Мы не можем запустить array_intersect для всего массива результатов, потому что элементы массива не являются скалярными значениями.

Я бы создал один цикл для хранения индексов первичного ключа, а затем вызвал для него array_filter, в котором функция проверила бы на предмет правильности соответствия.

global $aIds;
$aIds = array();

foreach($array_masters  as $item) {
    $aIds[] = $item->master_id;
}

function filter_correspondant($row) {
    global $aIds;
    return in_array($row->slave_id, $aIds);
}

$array_slaves_filtered = array_filter($array_slaves, 'filter_correspondant');

В приведенном выше фрагменте двамассивами являются $ array_masters и $ array_slaves.Полученный пересеченный массив - это $ array_slaves_filtered, который содержит строки из $ array_slaves, которые соответствуют ограничению внешнего ключа.

0 голосов
/ 22 января 2011

Похоже на работу для array_intersect .

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