首页 > 解决方案 > 如何从多维数组中删除php中特定键的重复值

问题描述

我在这里搜索了解决方案,但没有找到适合我用例的解决方案。

我有一个array像这个例子一样构建的大的:

Array
(
    [0] => Array
        (
            [Template] => page.html5
        )

    [1] => Array
        (
            [Template] => page2.html5
        )

    [2] => Array
        (
            [Template] => page.html5
        )

    [3] => Array
        (
            [Template] => page2.html5
        )

    [4] => Array
        (
            [Template] => page.html5
        )

    [5] => Array
        (
            [Template] => page2.html5
        )

    [6] => Array
        (
            [id] => 27
            [table] => tl_custom
            [type] => text
            [data] => Array
                (
                    [fragment] => example
                    [previewId] => 1
                    [isActive] => 1
                )

        )

)

我想删除array键“模板”的所有重复值,但除此之外我希望array保持原样。

所以之后我的数组应该是这样的:

Array
(
    [0] => Array
        (
            [Template] => page.html5
        )

    [1] => Array
        (
            [Template] => page2.html5
        )
    [6] => Array
        (
            [id] => 27
            [table] => tl_custom
            [type] => text
            [data] => Array
                (
                    [fragment] => example
                    [previewId] => 1
                    [isActive] => 1
                )

        )

)

有没有办法在不使用大量内存的情况下实现这一目标?感谢您的回答:)

标签: phparraysmultidimensional-array

解决方案


您可以使用以下逻辑,该逻辑使用:

array_map()用索引键值展平数组,并serialize()(字符串化)最后一个数组元素,以便我们可以 array_unique()在结果上使用。

然后,为了恢复字符串化的数组,即将它变成一个数组,我们使用unserialize().

<?php
$newArr = array_unique(array_map(function ($el) {
    return $el['Template'] ?? serialize($el);
}, $arr));

// restore the last element to array
$last = array_key_last($newArr); // (PHP 7 >= 7.3.0)*
$newArr[$last] = unserialize($newArr[$last]);

*如果 PHP 版本 <7.3.0 使用:end($newArr); $last = key($newArr);

输出:

Array
(
    [0] => page.html5
    [1] => page2.html5
    [6] => Array
        (
            [id] => 27
            [table] => tl_custom
            [type] => text
            [data] => Array
                (
                    [fragment] => example
                    [previewId] => 1
                    [isActive] => 1
                )

        )

)

工作演示


推荐阅读