我有一个像这样的多维数组:
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)不会显示在普通数组中。那些阵列实际上非常大,所以我不确定最快的方法是什么?
答案 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处理尽可能多的内容过滤总是一个好主意。