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

时间:2013-03-31 21:32:08

标签: php arrays multidimensional-array

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

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)不会显示在普通数组中。那些阵列实际上非常大,所以我不确定最快的方法是什么?

4 个答案:

答案 0 :(得分:4)

$normalArray = array_flip($normalArray);

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

正好需要两次迭代,每个阵列一次。使用$normalArray[$elem['memberId']]的密钥查找非常快。由于数组的功能性和副本,可能会有一些内存开销,使用传统的循环和unset如果这是一个问题。

答案 1 :(得分:3)

首先,我会翻转$nomal数组,以便在数组中获得恒定的查找时间,如下所示:

$normal = array_flip( $normal);

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

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

答案 2 :(得分:1)

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

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

$id_array是您在问题中提出的1维矩阵(数组)。

答案 3 :(得分:0)

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

我们不知道你正在使用的查询是什么样的,但是沿着这些方向的东西会这样做:

// 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处理尽可能多的内容过滤总是一个好主意。