如何过滤数组的行以便仅显示具有特定值的记录?

时间:2011-01-22 01:18:29

标签: php arrays filter

想象一下,我针对不同的数据库运行了2个查询。

源#1的查询结果将存储在一个数组中。 源#2的查询结果也将存储在数组中。

源#2记录将包含一个外键,该外键可能与源#1中ID字段中的特定记录匹配,也可能不匹配。

因此,如果我要遍历源#1然后我只想显示与源#1的ID匹配的源#2记录,那么在PHP中有一个方便的命令可以让我获得过滤后的结果每次运行循环时我都可以运行一次。

我想避免的是在循环中使用循环来检查结果,然后确定是否应该显示结果(希望内置的过滤器命令(如果可用的话,开销会减少)。

有关在PHP中过滤数组的命令的任何建议吗?

3 个答案:

答案 0 :(得分:0)

听起来像是array_intersect的工作。

答案 1 :(得分:0)

这取决于你正在优化的内容。

  • 代码行:使用Matt V提到的array_intersect(可能经过一些预处理)。
  • 内存/性能:创建一个字典(关联数组),其中键是源#1的ID。如果关注内存,则在处理完行后将其丢弃。值可以是任何值,比如TRUE。您现在可以使用isset($dict[$id])从源#2过滤数组,array_filter在接近恒定的时间内运行。 {{1}}在这里很有用。

答案 2 :(得分:0)

给定数组中的行是对象或数组。我们无法在整个结果数组上运行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中与外键约束匹配的行。