为多次遇到的值添加点和计数器作为后缀,如 R 的 make.unique 函数

问题描述 投票:0回答:3

我需要与 PHP 中的 R 函数 make.unique 相同的功能。

在 R 中:

> dup_array = c("a", "b", "a", "c")
> make.unique(dup_array)
[1] "a"   "b"   "a.1" "c"  

在 PHP 中:

> dup_array = array("a", "b", "a", "c")
> magic_function(dup_array)

什么是

magic_function

php arrays unique
3个回答
2
投票

你可以这样做:

<?php
function make_unique($a) {
    $d = array_count_values($a);
    $f = array_filter($d, function($k){
        return $k>1;
    });
    $k = array_keys($f);
    for ($i=0; $i < count($a); $i++) { 
        if(in_array($a[$i],$k) && $d[$a[$i]]>0) {
            $f[$a[$i]]--;
            $n = $d[$a[$i]]-$f[$a[$i]];
            if($n>1)$a[$i] = $a[$i].".".($n-1);
        }
    }
    return $a;
}

你可以测试一下:

$a = ["a","d","c","b","a","b","a","a","d","d","a"];
print_r(make_unique($a));

结果是:

Array
(
    [0] => a
    [1] => d
    [2] => c
    [3] => b
    [4] => a.1
    [5] => b.1
    [6] => a.2
    [7] => a.3
    [8] => d.1
    [9] => d.2
    [10] => a.4
)

2
投票

嗯,目前还没有内置函数,但是,您可以为其创建自己的自定义函数。

使用字典(关联数组)跟踪元素的当前频率,然后相应地附加当前频率。

<?php function makeUnique($arr){ $set = []; foreach($arr as $k => $v){ $set[ $v ] = ($set[ $v ] ?? 0) + 1; $arr[ $k ] = $arr[ $k ] . ($set[ $v ] > 1 ? '.' .($set[ $v ] - 1) : ''); } return $arr; } print_r(makeUnique($arr));

在线演示


0
投票
    在迭代时维护一个查找数组。
  • 仅在不是
  • 0
     时才显示查找值。
代码:(

演示

$array = ["a", "b", "a", "c"]; var_export( array_map( function ($v) { static $lookup = []; $lookup[$v] ??= 0; return $v . ($lookup[$v]++ ?: ''); }, $array ) );
请记住,只有当数组中的值是标量并且在用作键时不会被 PHP 更改时,使用查找数组才是安全的。例如,如果您尝试使用 

null

、布尔值、浮点数、数组或对象等,则查找不合适。

© www.soinside.com 2019 - 2024. All rights reserved.