我需要与 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
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
)
嗯,目前还没有内置函数,但是,您可以为其创建自己的自定义函数。
使用字典(关联数组)跟踪元素的当前频率,然后相应地附加当前频率。
<?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
时才显示查找值。
演示)
$array = ["a", "b", "a", "c"];
var_export(
array_map(
function ($v) {
static $lookup = [];
$lookup[$v] ??= 0;
return $v . ($lookup[$v]++ ?: '');
},
$array
)
);
请记住,只有当数组中的值是标量并且在用作键时不会被 PHP 更改时,使用查找数组才是安全的。例如,如果您尝试使用 null
、布尔值、浮点数、数组或对象等,则查找不合适。