2017-10-06 91 views
-3

我有一个数组$ 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 
    ) 
) 
+0

* “需要紧急帮助” * - 请删除。 –

+0

*“第二个问题?”* - 这让你的问题过于宽泛。一次提出一个问题,这就是它在Stack上的工作原理。 –

+0

请阅读[在什么情况下,我可以添加“紧急”或其他类似的短语到我的问题,以获得更快的答案?](/ meta.stackoverflow.com/q/326569) - 总结是,这不是这是解决志愿者问题的理想方式,可能会对获得答案产生反作用。请不要将此添加到您的问题中(尤其是因为您是一位有经验的用户,并且有望知道这一点)。 – halfer

回答

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['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); 
+0

但在你的回答中,我们根本不需要使用array_map。例如: - 'foreach($ near_by as $ a){$ near_by_final [$ a ['user_id']] = $ a;}'也会这样做。即使我们使用'$ a ['user_id']'作为数组索引,那么每次循环遇到相同值的user_id时,该数组索引的值都会被覆盖。 – Saswat

+1

@Saswat你需要'array_map',因为它反序列化你的数组并对它进行排序。是的,它将被覆盖(除非使用注释代码仅保留第一次出现)。但是,如果所有的值都是相同的,那么使用数据的副本是没有区别的 – Justinas

0

你的代码几乎是正确的,只是用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

相关问题