我有来自两个单独的mysql查询的数组数据。数组数据如下所示:
0
:
{user_id: 82, ac_type: 1,…}
1
:
{user_id: 80, ac_type: 5,…}
2
:
{user_id: 76, ac_type: 1,…}
3
:
{user_id: 82, ac_type: 1,…}
4
:
{user_id: 80, ac_type: 5,…}
我想删除重复的数组项。
所以,我的输出将是这样的:
0
:
{user_id: 82, ac_type: 1,…}
1
:
{user_id: 80, ac_type: 5,…}
2
:
{user_id: 76, ac_type: 1,…}
我想通过user_id检查重复。
我尝试了以下解决方案,但两种方法都没有按预期工作。
$input = array_unique($res, SORT_REGULAR);
$input = array_map("unserialize", array_unique(array_map("serialize", $res)));
我也在下面尝试过。
$results = array();
foreach ($res as $k => $v) {
$results[implode($v)] = $v;
}
$results = array_values($results);
print_r($results);
但仍存在重复数据。
答案 0 :(得分:3)
此任务不需要任何自定义函数调用。只需使用array_column()
为每个子阵列分配新的临时密钥,然后重新索引子阵列并打印到屏幕。 *这确实会覆盖较早出现的事件。
代码:(Demo)
$array=[
['user_id'=>82,'ac_type'=>1],
['user_id'=>80,'ac_type'=>5],
['user_id'=>76,'ac_type'=>1],
['user_id'=>82,'ac_type'=>2],
['user_id'=>80,'ac_type'=>6]
];
var_export(array_values(array_column($array,NULL,'user_id')));
输出:
array (
0 =>
array (
'user_id' => 82,
'ac_type' => 2,
),
1 =>
array (
'user_id' => 80,
'ac_type' => 6,
),
2 =>
array (
'user_id' => 76,
'ac_type' => 1,
),
)
如果您想保留第一次出现并忽略所有后续重复项,则会执行以下操作:
代码:(Demo)(*这会保留第一次出现)
$array=[
['user_id'=>82,'ac_type'=>1],
['user_id'=>80,'ac_type'=>5],
['user_id'=>76,'ac_type'=>1],
['user_id'=>82,'ac_type'=>2],
['user_id'=>80,'ac_type'=>6]
];
foreach($array as $a){
if(!isset($result[$a['user_id']])){
$result[$a['user_id']]=$a; // only store first occurence of user_id
}
}
var_export(array_values($result)); // re-index
输出:
array (
0 =>
array (
'user_id' => 82,
'ac_type' => 1,
),
1 =>
array (
'user_id' => 80,
'ac_type' => 5,
),
2 =>
array (
'user_id' => 76,
'ac_type' => 1,
),
)
如果您不介意丢失子阵列的顺序,可以使用array_reverse()
和array_column()
来保留第一次使用临时密钥,然后使用array_values()
重新编制索引:
var_export(array_values(array_column(array_reverse($array),NULL,'user_id')));
/*
array (
0 =>
array (
'user_id' => 76,
'ac_type' => 1,
),
1 =>
array (
'user_id' => 82,
'ac_type' => 1,
),
2 =>
array (
'user_id' => 80,
'ac_type' => 5,
),
)
*/
答案 1 :(得分:2)
$array = [
['user_id'=>82,'ac_type'=>1],
['user_id'=>80,'ac_type'=>5],
['user_id'=>76,'ac_type'=>1],
['user_id'=>82,'ac_type'=>2],
['user_id'=>80,'ac_type'=>6]
];
$array = array_reverse($array);
$v = array_reverse(
array_values(
array_combine(
array_column($array, 'user_id'),
$array
)
)
);
echo '<pre>';
var_dump($v);
结果:
array(3) {
[0]=>
array(2) {
["user_id"]=>
int(76)
["ac_type"]=>
int(1)
}
[1]=>
array(2) {
["user_id"]=>
int(82)
["ac_type"]=>
int(1)
}
[2]=>
array(2) {
["user_id"]=>
int(80)
["ac_type"]=>
int(5)
}
}
答案 2 :(得分:1)
我花了一段时间,但这应该有用(评论中的解释):
<?php
/* Example array */
$result = array(
0 => array(
"user_id" => 82,
"ac_type" => 1
),
1 => array(
"user_id" => 80,
"ac_type" => 5
),
2 => array(
"user_id" => 76,
"ac_type" => 1
),
3 => array(
"user_id" => 82,
"ac_type" => 2
),
4 => array(
"user_id" => 80,
"ac_type" => 2
)
);
/* Function to get the keys of duplicate values */
function get_keys_for_duplicate_values($my_arr, $clean = false) {
if ($clean) {
return array_unique($my_arr);
}
$dups = $new_arr = array();
foreach ($my_arr as $key => $val) {
if (!isset($new_arr[$val])) {
$new_arr[$val] = $key;
} else {
if (isset($dups[$val])) {
$dups[$val][] = $key;
} else {
//$dups[$val] = array($key);
$dups[] = $key;
// Comment out the previous line, and uncomment the following line to
// include the initial key in the dups array.
// $dups[$val] = array($new_arr[$val], $key);
}
}
}
return $dups;
}
/* Create a new array with only the user_id values in it */
$userids = array_combine(array_keys($result), array_column($result, "user_id"));
/* Search for duplicate values in the newly created array and return their keys */
$dubs = get_keys_for_duplicate_values($userids);
/* Unset all the duplicate keys from the original array */
foreach($dubs as $key){
unset($result[$key]);
}
/* Re-arrange the original array keys */
$result = array_values($result);
echo '<pre>';
print_r($result);
echo '</pre>';
?>
这个问题的答案来自于Get the keys for duplicate values in an array
<强>输出:强>
Array
(
[0] => Array
(
[user_id] => 82
[ac_type] => 1
)
[1] => Array
(
[user_id] => 80
[ac_type] => 5
)
[2] => Array
(
[user_id] => 76
[ac_type] => 1
)
)
答案 3 :(得分:1)
经过测试和工作的例子。
<?php
$details = array('0'=> array('user_id'=>'82', 'ac_type'=>'1'), '1'=> array('user_id'=>'80', 'ac_type'=>'5'), '2'=>array('user_id'=>'76', 'ac_type'=>'1'), '3'=>array('user_id'=>'82', 'ac_type'=>'1'), '4'=>array('user_id'=>'80', 'ac_type'=>'5'));
function unique_multidim_array($array, $key) {
$temp_array = array();
$i = 0;
$key_array = array();
foreach($array as $val) {
if (!in_array($val[$key], $key_array)) {
$key_array[$i] = $val[$key];
$temp_array[$i] = $val;
}
$i++;
}
return $temp_array;
}
?>
<?php
$details = unique_multidim_array($details,'user_id');
?>
<pre>
<?php print_r($details); ?>
</pre>
将输出:
Array
(
[0] => Array
(
[user_id] => 82
[ac_type] => 1
)
[1] => Array
(
[user_id] => 80
[ac_type] => 5
)
[2] => Array
(
[user_id] => 76
[ac_type] => 1
)
)
取自用户提供的备注中的http://php.net/manual/en/function.array-unique.php。