如何删除具有相同值的数组元素?
问题描述:
我有一个数组$ near_by。该结构是这样的: -如何删除具有相同值的数组元素?
Array
(
[0] => Array
(
[user_id] => 10
[fname] => Test
[lname] =>
[image] => http://link//2.jpg
[category_id] => 2
[category_name_en] => Clinic
[category_name_ar] =>
[institute_rank] => 1
[institute_rating] => 4.00
[institute_review] => 1
[total_institute] => 8
[latitude] => 44.000984
[longitude] => 106.76654
)
[1] => Array
(
[user_id] => 10
[fname] => Test
[lname] =>
[image] => http://link//2.jpg
[category_id] => 2
[category_name_en] => Clinic
[category_name_ar] =>
[institute_rank] => 1
[institute_rating] => 4.00
[institute_review] => 1
[total_institute] => 8
[latitude] => 44.000984
[longitude] => 106.76654
)
)
第一个问题: -
我想删除重复的元素。就像第0个元素和第1个元素一样,所以我想要一个新的数组,只有一个来自重复值。
所以我写的代码,这片: -
$near_by_arr = array_map("unserialize", array_unique(array_map("serialize", $near_by),SORT_REGULAR));
$near_by_final = array();
foreach($near_by_arr as $a)
{
$near_by_final[] = $a;
}
然而,新的阵列$ near_by_final仍然包含重复的数据。我在另一个应用程序中使用了相同的代码,它似乎在那里工作。我现在做什么错了?
第二个问题?
假设每个索引中的子数组在结构上完全不同,但具有可能包含相同值的通用索引“user_id”。如何从具有相同user_id值的元素中仅检索一个元素?
说,例如,
Array
(
[0] => Array
(
[user_id] => 10
[fname_en] => Test
[lname_en] =>
[image] => http://link//2.jpg
[category_id] => 2
[category_name_en] => Clinic
[category_name_ar] =>
[latitude] => 44.000984
[longitude] => 106.76654
)
[1] => Array
(
[user_id] => 10
[fname] => Test
[lname] =>
[image] => http://link//2.jpg
[category_id] => 2
[category_name_en] => Clinic
[category_name_ar] =>
[institute_rank] => 1
[institute_rating] => 4.00
[institute_review] => 1
[total_institute] => 8
[latitude] => 44.000984
[longitude] => 106.76654
)
)
如何可以有一个数组,这将具有以下结构?
Array
(
[0] => Array
(
[user_id] => 10
[fname_en] => Test
[lname_en] =>
[image] => http://link//2.jpg
[category_id] => 2
[category_name_en] => Clinic
[category_name_ar] =>
[latitude] => 44.000984
[longitude] => 106.76654
)
)
答
只需在创建阵列时,使用关联数组,而不是索引:
$near_by_arr = array_map("unserialize", array_unique(array_map("serialize", $near_by),SORT_REGULAR));
$near_by_final = array();
foreach($near_by_arr as $a) {
$near_by_final[$a['user_id']] = $a;
/*
OR to keep only first entry:
if (!isset($near_by_final[$a['user_id']])) {
$near_by_final[$a['user_id']] = $a;
}
*/
}
如果需要用它来进行索引任何方式:
foreach() {...}
$near_by_final = array_values($near_by_final);
答
你的代码几乎是正确的,只是用USER_ID作为索引而不是anto递增索引。
EQ:
$near_by_arr = array_map("unserialize", array_unique(array_map("serialize", $near_by), SORT_REGULAR));
$near_by_final = array();
foreach ($near_by_arr as $a) {
$near_by_final[$a['user_id']] = $a;
}
+0
但是在你的答案中,我们根本不需要使用array_map。例如: - 'foreach($ near_by as $ a){$ near_by_final [$ a ['user_id']] = $ a;}'也会这样做。 – Saswat
* “需要紧急帮助” * - 请删除。 –
*“第二个问题?”* - 这让你的问题过于宽泛。一次提出一个问题,这就是它在Stack上的工作原理。 –
请阅读[在什么情况下,我可以添加“紧急”或其他类似的短语到我的问题,以获得更快的答案?](/ meta.stackoverflow.com/q/326569) - 总结是,这不是这是解决志愿者问题的理想方式,可能会对获得答案产生反作用。请不要将此添加到您的问题中(尤其是因为您是一位有经验的用户,并且有望知道这一点)。 – halfer