在PHP中比较单维数组和多维数组的最快方法


Fastes way to compare single-dimensional against multidimensional array in PHP

我有一个多维数组,像这样:

Array (
[0] => Array
    (
        [time] => 1364685993
        [memberid] => 131
    )
[1] => Array
    (
        [time] => 1364685994
        [memberid] => 133
    )
[2] => Array
    (
        [time] => 1364685995
        [memberid] => 141
    )
)

和像这样的一维数组:

Array (
  [0] => 131
  [1] => 141
  [2] => 191
  [3] => 205
)

现在我想从多维数组中删除所有不包含正常数组中的memberid值的子数组?

在这种情况下,只有Subaray[1]要从多维数组中删除,因为它的'memberid'键值(133)不显示在正常数组中。这些数组实际上非常大,所以我不确定最快的方法是什么?

$normalArray = array_flip($normalArray);
$multiDimArray = array_filter($multiDimArray, function ($elem) use ($normalArray) {
    return isset($normalArray[$elem['memberid']]);
});

只需要两次迭代,每个数组一次。使用$normalArray[$elem['memberId']]进行键查找非常快。由于函数性质和数组的副本,可能会有一些内存开销,如果有问题,请使用传统的循环和unset

首先,我将翻转$nomal数组以获得常量查找时间,如下所示:

$normal = array_flip( $normal);

然后,您只需通过简单的查找通过$normal数组过滤$multidimensional_array:

$filtered = array_filter( $multidimensional_array, function( $el) use( $normal) {
    return isset( $normal[ $el['member_id'] ]);
});

目前无法访问开发资源进行测试,但这应该可以工作。

foreach($members as $member => $property) {
    if (!in_array($property['member_id'], $id_array)) {
        unset($members[$member]);
    }
}

$id_array是您在问题中放入的一维矩阵(数组)。

您可能希望在数据库查询本身中使用单维数组,而不是事后过滤数据库结果。

我们不知道你正在使用的查询是什么样子的,但是沿着这几行可以做到:

// The ids from the file
$use_ids = array(131, 141, 191, 205);
// Create a list for the IN clause
$ids = '(' . implode(',', $use_ids) . ')';
// Create the query
$query = <<< SQL
    SELECT time, memberid
    FROM some_table
    WHERE ...
        AND memberid IN {$ids}
    ORDER BY time
SQL;
// Execute the query, etc.

让SQL处理尽可能多的内容过滤总是一个好主意。