【问题标题】:PHP How to remove duplicate value in multidimensional array and merge othersPHP如何删除多维数组中的重复值并合并其他值
【发布时间】:2014-01-27 07:03:07
【问题描述】:

我在这个问题上花了几个小时。 我有一个包含字体详细信息的多维数组,我想合并它以向谷歌网络字体发送一个请求。 (每个数组描述不同html标签的字体细节)任何人都可以帮助我吗?

输入:

Array
(
[1] => Array
    (
        [family] => Abril Fatface
        [weight] => regular
        [charset] => latin,latin-ext
    )

[2] => Array
    (
        [family] => Akronim
        [weight] => regular
        [charset] => latin
    )

[3] => Array
    (
        [family] => Akronim
        [weight] => regular, bold
        [charset] => latin
    )

[4] => Array
    (
        [family] => Akronim
        [weight] => regular
        [charset] => latin, latin-ext
    )

[5] => Array
    (
        [family] => Acme
        [weight] => regular
        [charset] => latin
    )


)

输出:

Array
 [0]   (
        [family] => Abril Fatface
        [weight] => regular
        [charset] => latin,latin-ext

    )

[1] (
        [family] => Akronim
        [weight] => regular, bold
        [charset] => latin,latin-ext

    )
[2] (
        [family] => Acme
        [weight] => regular
        [charset] => latin

    )

【问题讨论】:

  • array_filter 可以帮助解决这个问题us1.php.net/manual/en/function.array-filter.php
  • @Jessica 我知道重复是一种痛苦,但你意识到你提出的问题是 5 岁?可能会因为他没有很好地使用“搜索”而打他。
  • @Jessica 有点敏感???这是我第一次谈论你的重复标志,我不在乎你有多少标志!骗子太多了。问题相对不同,如何处理数据肯定会在 5 年内发生变化。很抱歉踩到你敏感的脚趾...
  • @user3175305 如果您尝试过,您应该在帖子中包含您尝试过的内容以及您遇到的问题。

标签: php arrays multidimensional-array duplicates google-webfonts


【解决方案1】:

功能

function font_merge_unique($col, $arr, $exj)
{
    $test = array();

    foreach($arr AS $key => $row)
    {
        $test[$key] = strtolower(preg_replace('/[^A-Za-z0-9]/', '', $row[$col]));
        foreach($exj AS $index)
        {
            $arr[$key][$index] = array_map('trim', (is_array($arr[$key][$index]) ? $arr[$key][$index] : explode(',', $arr[$key][$index])));
        }
    }

    $unique = array_unique($test);

    $dupes = array_diff_key($test, $unique);

    $list = array();

    foreach($unique AS $key => $n)
    {
        $list[$key] = $arr[$key];
    }

    foreach($dupes AS $di => $row)
    {
        $index = array_search($row, $unique);

        foreach($exj AS $merge)
        {
            $list[$index][$merge] += $arr[$di][$merge];
        }
    }

    foreach($list AS $index => $row)
    {
        foreach($exj AS $merge)
        {
            $list[$index][$merge] = implode(',', $list[$index][$merge]);
        }
    }

    return array_values($list);
}

用法

  • Param 1(字符串)要使其唯一的值的键名。
  • 要处理的参数 2(数组)。
  • Param 3 (Array) 已处理数组中的键列表,以使 (String|Array) 值成为唯一的逗号分隔字符串。

    font_merge_unique('family', $array, array('weight','charset'))

结果

Array
(
    [0] => Array
        (
            [family] => Abril Fatface
            [weight] => regular
            [charset] => latin,latin-ext
        )

    [1] => Array
        (
            [family] => Akronim
            [weight] => regular,bold
            [charset] => latin,latin-ext
        )

    [2] => Array
        (
            [family] => Acme
            [weight] => regular
            [charset] => latin
        )

)

【讨论】:

    【解决方案2】:

    你只需要两个循环。

    循环 1:按 family 分组并收集唯一的 weightcharset 值。我将值存储为键,因为 php 会默默地覆盖重复项。我使用preg_split() 来处理非标准分隔符。

    循环 2:用逗号连接来自 weightcharset 的唯一数组键。

    需要明确的是,+= 不是求和技术,它是“联合赋值”组合运算符——它将一个数组写入另一个数组(如 array_replace()array_merge() 会)。

    代码:(Demo)

    $result = [];
    foreach ($fonts as $row) {
        $row['weight'] = array_flip(preg_split('~, ?~', $row['weight'], 0, PREG_SPLIT_NO_EMPTY));
        $row['charset'] = array_flip(preg_split('~, ?~', $row['charset'], 0, PREG_SPLIT_NO_EMPTY));
        if (!isset($result[$row['family']])) {
            $result[$row['family']] = $row;
        } else {
            $result[$row['family']]['weight'] += $row['weight'];
            $result[$row['family']]['charset'] += $row['charset'];
        }
    }
    foreach ($result as &$row) {
        $row['weight'] = implode(',', array_keys($row['weight']));
        $row['charset'] = implode(',', array_keys($row['charset']));
    }
    var_export(array_values($result));
    

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 2015-06-04
      • 2021-06-19
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      相关资源
      最近更新 更多