我有一个多维数组,像这样:
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处理尽可能多的内容过滤总是一个好主意。