PHP在递归数组中移动重复项

时间:2016-07-08 11:05:39

标签: php arrays

我构建一个使用填充了翻译键的数组构建的翻译表单,但是密钥通常是重复的。当表单在组中构建时,我想将重复项移动到$translatables['global'] 请注意,您在下图中看到的内容已经放在$translatables['modules']['Module_{{ModuleName}}']

如下图所示,某些字段是重复的。那些需要被移动。重复项可以跨多个元素放置。 If the issue isn't clear you can see it here

我编辑了重复的消息:它是一个问题,移动这些值而不是过滤它们(并保留1个),它们需要放在全局部分下。

1 个答案:

答案 0 :(得分:0)

我自己解决了

class Tools_Array
{
    public static function find_duplicates_recursive(&$array, $remove = false)
    {
        $duplicates = array();

        $valueCounts = array_count_values(self::array_values_recursive($array));
        foreach ($valueCounts as $key => $value) {
            if ($value > 1)
            {
                $duplicates[] = $key;
            }
        }

        if ($remove) {
            foreach ($duplicates as $duplicate)
            {
                $array = self::remove_values_recursive($array, $duplicate);
            }
        }

        return $duplicates;
    }

    public static function array_values_recursive($array)
    {
        $arr2 = array();
        foreach ($array as $key => $value)
        {
            if(is_array($value))
            {
                $arr2 = array_merge(array_values_recursive($value), $arr2);
            }else{
                $arr2[] = $value;
            }
        }

        return $arr2;
    }

    public static function remove_values_recursive($array, $needle)
    {
        foreach ($array as $key => $value)
        {
            if(is_array($value))
            {
                $array[$key] = self::remove_values_recursive($value, $needle);
            }else{
                if ($value == $needle)
                {
                    unset($array[$key]);
                }
            }
        }

        return $array;
    }
}

然后我可以用:

过滤它
$duplicates = Tools_Array::find_duplicates_recursive($translatables, true);
$translatables['globaal'] = array_merge($translatables['globaal'], $duplicates);