【问题标题】:Remove duplicate item from multidimensional array从多维数组中删除重复项
【发布时间】:2018-07-26 03:21:39
【问题描述】:

如何从我的多维对象数组中删除重复项?

在下面的示例中,我有 2 个项目包含 4 (fullname is 'Jodie (Y6Y5)') 的 id 值。

我需要修改我的数组,以便没有重复的 id 值。

我尝试过使用循环来修复它,我也尝试过array_unique()

有没有人对我如何实现这一点有更好的想法?

示例输入数组:

Array
(
    [0] => guardian Object
        (
            [guardians] => Array
                (
                )

            [errors] => Array
                (
                )

            [id] => 4
            [pupil_id] => 1
            [pupil_id_1] => 2
            [pupil_id_2] => 0
            [pupil_id_3] => 0
            [pupil_id_4] => 0
            [school_id] => 1
            [title] => 
            [firstname] => 
            [surname] => 
            [fullname] => Jodie (Y6Y5)
            [email] => jodie@email.co.uk
            [email_2] => 
            [telephone] => 0777777777777
            [telephone_2] => 07777777777
            [username] => jerrys
            [password] => password
            [active] => 1
            [deleted] => 0
            [inserted] => 2018-02-06 14:23:02
            [updated] => 2018-02-14 14:18:08
            [login] => 2018-02-13 15:45:09
            [last_login] => 0000-00-00 00:00:00
            [email_update_app] => 0
            [email_update_app_date] => 0000-00-00 00:00:00
            [email_update_web] => 0
            [email_update_web_date] => 0000-00-00 00:00:00
            [is_wonde] => 0
            [wonde_id] => 
            [wonde_mis_id] => 
            [wonde_upi] => 
            [grade_id] => 86
        )

    [1] => guardian Object
        (
            [guardians] => Array
                (
                )

            [errors] => Array
                (
                )

            [id] => 3
            [pupil_id] => 5
            [pupil_id_1] => 2
            [pupil_id_2] => 0
            [pupil_id_3] => 0
            [pupil_id_4] => 0
            [school_id] => 1
            [title] => 
            [firstname] => 
            [surname] => 
            [fullname] => Karla (Rec Y5)
            [email] => karla@email.co.uk
            [email_2] => ally@email.com
            [telephone] => 
            [telephone_2] => 
            [username] => rickygutpa
            [password] => password
            [active] => 1
            [deleted] => 0
            [inserted] => 2018-02-06 10:33:30
            [updated] => 2018-02-14 14:16:21
            [login] => 0000-00-00 00:00:00
            [last_login] => 0000-00-00 00:00:00
            [email_update_app] => 0
            [email_update_app_date] => 0000-00-00 00:00:00
            [email_update_web] => 0
            [email_update_web_date] => 0000-00-00 00:00:00
            [is_wonde] => 0
            [wonde_id] => 
            [wonde_mis_id] => 
            [wonde_upi] => 
            [grade_id] => 86
        )

    [2] => guardian Object
        (
            [guardians] => Array
                (
                )

            [errors] => Array
                (
                )

            [id] => 1
            [pupil_id] => 4
            [pupil_id_1] => 0
            [pupil_id_2] => 0
            [pupil_id_3] => 0
            [pupil_id_4] => 0
            [school_id] => 1
            [title] => 
            [firstname] => 
            [surname] => 
            [fullname] => Florence (Y6 2)
            [email] => florence@email.co.uk
            [email_2] => 
            [telephone] => 0777777777777
            [telephone_2] => 
            [username] => mrslacey
            [password] => password
            [active] => 1
            [deleted] => 0
            [inserted] => 2018-02-01 09:47:34
            [updated] => 2018-02-14 14:49:32
            [login] => 2018-02-05 11:48:54
            [last_login] => 0000-00-00 00:00:00
            [email_update_app] => 0
            [email_update_app_date] => 0000-00-00 00:00:00
            [email_update_web] => 0
            [email_update_web_date] => 0000-00-00 00:00:00
            [is_wonde] => 0
            [wonde_id] => 
            [wonde_mis_id] => 
            [wonde_upi] => 
            [grade_id] => 87
        )

    [3] => guardian Object
        (
            [guardians] => Array
                (
                )

            [errors] => Array
                (
                )

            [id] => 4
            [pupil_id] => 1
            [pupil_id_1] => 2
            [pupil_id_2] => 0
            [pupil_id_3] => 0
            [pupil_id_4] => 0
            [school_id] => 1
            [title] => 
            [firstname] => 
            [surname] => 
            [fullname] => Jodie (Y6Y5)
            [email] => jodie@email.co.uk
            [email_2] => 
            [telephone] => 0777777777777
            [telephone_2] => 07777777777
            [username] => jerrys
            [password] => password
            [active] => 1
            [deleted] => 0
            [inserted] => 2018-02-06 14:23:02
            [updated] => 2018-02-14 14:18:08
            [login] => 2018-02-13 15:45:09
            [last_login] => 0000-00-00 00:00:00
            [email_update_app] => 0
            [email_update_app_date] => 0000-00-00 00:00:00
            [email_update_web] => 0
            [email_update_web_date] => 0000-00-00 00:00:00
            [is_wonde] => 0
            [wonde_id] => 
            [wonde_mis_id] => 
            [wonde_upi] => 
            [grade_id] => 87
        )

)

预期结果:

Array
(
    [0] => guardian Object
        (
            [guardians] => Array
                (
                )

            [errors] => Array
                (
                )

            [id] => 4
            [pupil_id] => 1
            [pupil_id_1] => 2
            [pupil_id_2] => 0
            [pupil_id_3] => 0
            [pupil_id_4] => 0
            [school_id] => 1
            [title] => 
            [firstname] => 
            [surname] => 
            [fullname] => Jodie (Y6Y5)
            [email] => jodie@email.co.uk
            [email_2] => 
            [telephone] => 0777777777777
            [telephone_2] => 07777777777
            [username] => jerrys
            [password] => password
            [active] => 1
            [deleted] => 0
            [inserted] => 2018-02-06 14:23:02
            [updated] => 2018-02-14 14:18:08
            [login] => 2018-02-13 15:45:09
            [last_login] => 0000-00-00 00:00:00
            [email_update_app] => 0
            [email_update_app_date] => 0000-00-00 00:00:00
            [email_update_web] => 0
            [email_update_web_date] => 0000-00-00 00:00:00
            [is_wonde] => 0
            [wonde_id] => 
            [wonde_mis_id] => 
            [wonde_upi] => 
            [grade_id] => 86
        )

    [1] => guardian Object
        (
            [guardians] => Array
                (
                )

            [errors] => Array
                (
                )

            [id] => 3
            [pupil_id] => 5
            [pupil_id_1] => 2
            [pupil_id_2] => 0
            [pupil_id_3] => 0
            [pupil_id_4] => 0
            [school_id] => 1
            [title] => 
            [firstname] => 
            [surname] => 
            [fullname] => Karla (Rec Y5)
            [email] => karla@email.co.uk
            [email_2] => ally@email.com
            [telephone] => 
            [telephone_2] => 
            [username] => rickygutpa
            [password] => password
            [active] => 1
            [deleted] => 0
            [inserted] => 2018-02-06 10:33:30
            [updated] => 2018-02-14 14:16:21
            [login] => 0000-00-00 00:00:00
            [last_login] => 0000-00-00 00:00:00
            [email_update_app] => 0
            [email_update_app_date] => 0000-00-00 00:00:00
            [email_update_web] => 0
            [email_update_web_date] => 0000-00-00 00:00:00
            [is_wonde] => 0
            [wonde_id] => 
            [wonde_mis_id] => 
            [wonde_upi] => 
            [grade_id] => 86
        )

    [2] => guardian Object
        (
            [guardians] => Array
                (
                )

            [errors] => Array
                (
                )

            [id] => 1
            [pupil_id] => 4
            [pupil_id_1] => 0
            [pupil_id_2] => 0
            [pupil_id_3] => 0
            [pupil_id_4] => 0
            [school_id] => 1
            [title] => 
            [firstname] => 
            [surname] => 
            [fullname] => Florence (Y6 2)
            [email] => florence@email.co.uk
            [email_2] => 
            [telephone] => 0777777777777
            [telephone_2] => 
            [username] => mrslacey
            [password] => password
            [active] => 1
            [deleted] => 0
            [inserted] => 2018-02-01 09:47:34
            [updated] => 2018-02-14 14:49:32
            [login] => 2018-02-05 11:48:54
            [last_login] => 0000-00-00 00:00:00
            [email_update_app] => 0
            [email_update_app_date] => 0000-00-00 00:00:00
            [email_update_web] => 0
            [email_update_web_date] => 0000-00-00 00:00:00
            [is_wonde] => 0
            [wonde_id] => 
            [wonde_mis_id] => 
            [wonde_upi] => 
            [grade_id] => 87
        )
)

【问题讨论】:

    标签: php object multidimensional-array duplicates


    【解决方案1】:

    最佳实践(以及您每天都会在 Stackoverflow 问题中发现的一种技术)是分配临时键,根据临时键覆盖任何预先存在的子数组,然后在最后删除临时键。

    这避免了进行迭代查找。为了在您的代码中获得最高效率,请尽量减少迭代函数调用。

    方法 #1:删除早期重复出现/保留最后出现 (Demo)

    foreach($guardian->guardians as $subarray){
        $result[$subarray->id]=$subarray;  // assign temporary keys
    }
    $guardian->guardians=array_values($result);  // re-declare and remove temporary keys (re-index the subarrays)
    var_export($guardian);
    

    *另外,这是一个提供相同效果的函数式单线:(Demo)

    $guardian->guardians=array_values(array_column((array)$guardian->guardians,NULL,'id'));
    var_export($guardian);
    

    对于那些不知道的人,array_column() 阻塞了对象,因此必须将对象临时转换为数组。


    方法 #2:删除后面的重复出现/保留第一次出现 (Demo)

    foreach($guardian->guardians as $subarray){
        if(!isset($result[$subarray->id])){
            $result[$subarray->id]=$subarray;  // only store if first occurrence of id
        }
    }
    $guardian->guardians=array_values($result);  // re-index
    var_export($guardian);
    

    【讨论】:

      【解决方案2】:

      通过以下操作,我设法得到了一个有效的答案:

      $tempGuardians = array();
      
      foreach($guardian->guardians as $key => $value){
          if (in_array($value->id, $tempGuardians)){
              unset($guardian->guardians[$key]);
          } else {
              array_push($tempGuardians, $value->id);
          }
      }
      
      unset($tempGuardians);
      

      如果有人知道任何更清洁的方法或更好的方法,我愿意接受新的方法。

      【讨论】:

        【解决方案3】:

        答案已包含在您的问题中,您已经说过:array_unique:

        $newArray=array_unique($a1);
        

        【讨论】:

        • 这只有在我有两个数组的情况下才有效,对吧?我没有使用两个数组
        • 我试过array_unique 它不适用于多维数组
        猜你喜欢
        • 2014-05-26
        • 2012-12-14
        • 2021-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-06
        • 1970-01-01
        • 2017-07-23
        相关资源
        最近更新 更多