从多维数组中删除重复项

时间:2018-02-15 11:22:49

标签: php object multidimensional-array duplicates

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

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

我需要修改我的数组,以便没有重复的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
        )
)

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

我设法通过以下方式获得了有效的答案:

$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);

如果有人知道更清洁的方式或更好的方法,我会接受新的方式。

答案 2 :(得分:-1)

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

$newArray=array_unique($a1);