如果您愿意,您可以使用数组函数并放弃 foreach 循环:
这是一句:
Code:
$value = [10, 10, 5, 8];
var_export(array_keys(array_intersect(array_count_values($value),[1])));
作为多行:
var_export(
array_keys(
array_intersect(
array_count_values($value),
[1]
)
)
);
Output:
array (
0 => 5,
1 => 8,
)
这将值计数为数组,然后使用array_intersect()
只保留出现一次的值,然后将键转换为零索引数组的值。
上面的代码片段与 @modsfabio 和 @axiac 的答案相同。我的代码片段的唯一优点是简洁。他们的解决方案可能会优于我的解决方案,但在相对较小的数据集上判断速度可能会浪费开发时间。对于处理相对较大数据集的任何人,请自行进行基准测试以找到最有效的技术。
为了实现最低的计算/时间复杂度,请使用单个循环,并在迭代时有条件地填充查找数组并unset()
如所须。
Code: (Demo https://3v4l.org/7WFol) (交叉链接到我的 CodeReview 答案 https://codereview.stackexchange.com/a/269671/141885)
$values = [10, 10, 5, 8];
$found = [];
foreach ($values as $index => $value) {
if (!isset($found[$value])) {
$found[$value] = $index;
} else {
unset($values[$index], $values[$found[$value]]);
}
}
var_export($values);
// [2 => 5, 3 => 8]
一些注意事项:
- 如果处理浮点值,使用将值存储为键的技术(正如我的所有代码片段所做的那样),那么结果可能不正确,因为 php 在用作键时会将浮点更改为整数。
- PHP 搜索键的速度始终比搜索值快得多。