我执行四个单独的mysql查询,返回四个不同的userid数组。我需要检查所有数组中所有数组中出现的用户ID,然后创建一个包含这些值的新数组,以便我可以在另一个查询中使用它。
Array ( [0] => Array ( [userid] => 11 )
[1] => Array ( [userid] => 22 )
[2] => Array ( [userid] => 33 )
)
Array ( [0] => Array ( [userid] => 11 )
[1] => Array ( [userid] => 99 )
[2] => Array ( [userid] => 33 )
)
Array ( [0] => Array ( [userid] => 11 )
[1] => Array ( [userid] => 33 )
)
Array ( [0] => Array ( [client_id] => 11 )
[1] => Array ( [client_id] => 33 )
[2] => Array ( [client_id] => 99 )
)
所以我的最后一个阵列来自这四个:
Array ( [0] => Array ( [id] => 11 )
[1] => Array ( [id] => 33 )
)
我试图用array_count_values
来解决鼠标问题,但是没有取得多大成功。
答案 0 :(得分:1)
您可以在一个查询中执行此操作,而不是使用与MySQL的联合/联接的4-5个单独查询,但是如果没有看到您的数据库查询和设计,我无法确定。但我愿意打赌你可以。尝试尽可能少地进行查询,因为它会降低性能。
除了上面的以下声明之外,您还可以通过以下几种方式处理这个问题。
最实用的?
创建一个空数组,例如名为 $ user_ids
循环遍历每个数组并使用数组$ user_ids中的SQL数据中的user_id创建索引,并将1附加到其值,以便它充当计数器。完成循环遍历SQL数据后,循环遍历计数器数组并取消设置少于循环数组的数据。
示例:强>
$user_ids = array();
$mysql_dataset = array($first_array, $second_array, $third_array, $fourth_array);
foreach ($mysql_dataset as $mysql_data) {
foreach ($mysql_data as $user) {
if (empty($user_ids[$user['user_id']])) {
$user_ids[$user['user_id']] = 0;
}
$user_ids[$user['user_id']]++;
}
}
foreach ($user_ids as $user_id => $count) {
if ($count < 4) {
unset($user_ids[$user_id]);
}
}
print_r($user_ids);
答案 1 :(得分:1)
PHP的内置数组函数可以在几行内处理您需要的大部分内容,而无需花费大量的手动循环。
由于这些数组上有不同的键,因此可以使用array_map()
运行每个键以提取所需的键并将其展平为单个维度。然后在四个结果数组上调用array_intersect()
以获得相交的id:
http://codepad.viper-7.com/x0Ncm0
// Your original arrays...
$a1 = array(array('userid'=>11),array('userid'=>22),array('userid'=>33));
$a2 = array(array('userid'=>11),array('userid'=>99),array('userid'=>33));
$a3 = array(array('userid'=>11),array('userid'=>33));
$a4 = array(array('client_id'=>11),array('client_id'=>33),array('client_id'=>99));
// Flatten each array using array_map() to return the desired key
function callback_userid($a) { return $a['userid']; }
function callback_client_id($a) { return $a['client_id']; }
$a1flat = array_map('callback_userid', $a1);
$a2flat = array_map('callback_userid', $a2);
$a3flat = array_map('callback_userid', $a3);
$a4flat = array_map('callback_client_id', $a4);
// Then get an intersection of all four flattened arrays
print_r(array_intersect($a1flat, $a2flat, $a3flat, $a4flat));
Array
(
[0] => 11
[2] => 33
)
如果要从零重新索引键,请在输出数组上调用array_values()
。或者,如果您确实需要将其中的二维数组作为id
键入,则循环将执行:
foreach ($output as $key => $value) {
// Append a new array with 'id'
$output[] = array('id' => $value);
// unset the original key
unset($output[$key]);
}
如果你没有将这四个查询用于非常不同的目的(因此无论如何也不必单独执行它们),那么你很可能会在单个SQL查询中输出这些信息。很难说没有看到更多的代码。