2

我执行了四个单独的 mysql 查询,它们返回四个不同的用户 ID 数组。我需要检查所有数组中出现的用户 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但并没有取得太大的成功。

4

2 回答 2

1

您可能可以在单个查询中执行此操作,而不是使用 MySQL 的 union/join 进行 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);
于 2013-01-29T03:36:38.113 回答
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()如果要从零重新索引键,请调用输出数组。或者,如果您确实需要将它们作为 2D 数组键入id,则可以使用循环:

foreach ($output as $key => $value) {
  // Append a new array with 'id'
  $output[] = array('id' => $value);
  // unset the original key
  unset($output[$key]);
}

但是,如果您没有将这四个查询用于非常不同的目的(因此不必单独执行它们),您可能能够在单个 SQL 查询中哄骗出这些信息。很难说没有看到更多的代码。

于 2013-01-29T03:38:27.703 回答