获取多个数组中出现的值

时间:2013-01-29 03:24:30

标签: php arrays

我执行四个单独的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来解决鼠标问题,但是没有取得多大成功。

2 个答案:

答案 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查询中输出这些信息。很难说没有看到更多的代码。