0

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

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

4 回答 4

4
$normalArray = array_flip($normalArray);

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

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

于 2013-03-31T21:39:34.670 回答
3

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

$normal = array_flip( $normal);

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

$filtered = array_filter( $multidimensional_array, function( $el) use( $normal) {
    return isset( $normal[ $el['member_id'] ]);
});
于 2013-03-31T21:39:23.817 回答
1

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

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

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

于 2013-03-31T21:38:50.503 回答
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 处理尽可能多的内容过滤总是一个好主意。

于 2013-03-31T21:57:32.123 回答