php过滤数组值并从多维数组中删除重复项
-
20-12-2019 - |
题
你好,所有我试图从这个数组中找到重复的x值并删除它们,只留下唯一的值。例如我的数组是
Array
(
[0] => Array
(
[x] => 0.5
[y] => 23
)
[1] => Array
(
[x] => 23
[y] => 21.75
)
[2] => Array
(
[x] => 14.25
[y] => 21.875
)
[3] => Array
(
[x] => 19.375
[y] => 21.75
)
[4] => Array
(
[x] => 9.125
[y] => 21.875
)
[5] => Array
(
[x] => 23
[y] => 19.625
)
[6] => Array
(
[x] => 19.375
[y] => 19.625
)
)
所以我需要发生的是循环遍历整个事情,并将第一个x值视为。5然后继续,任何其他有x作为。5从数组中删除它,以便在最后我有一个看起来像这样的数组
Array
(
[0] => Array
(
[x] => 0.5
[y] => 23
)
[1] => Array
(
[x] => 23
[y] => 21.75
)
[2] => Array
(
[x] => 14.25
[y] => 21.875
)
[3] => Array
(
[x] => 19.375
[y] => 21.75
)
[4] => Array
(
[x] => 9.125
[y] => 21.875
)
)
其中所有的X值都是唯一的。我在网上搜索,发现这个功能使用,但这似乎不起作用:
$result = array_map("unserialize", array_unique(array_map("serialize", $array)));
解决方案
只需循环,并找到唯一的值,当你去:
$taken = array();
foreach($items as $key => $item) {
if(!in_array($item['x'], $taken)) {
$taken[] = $item['x'];
} else {
unset($items[$key]);
}
}
每次第一次 x
价值被使用,我们保存它-和随后的用法是 unset
从阵列。
其他提示
array_unique
比较字符串值,因此您可以创建对象(具有超载的__toString
函数)作为中间步骤。
class XKeyObj {
public $x;
public $y;
public function XKeyObj($x, $y) {
$this->x = $x;
$this->y = $y;
}
public function __toString() { return strval($this->x); }
}
function array_to_xKey($arr) { return new XKeyObj($arr['x'], $arr['y']); }
function xKey_to_array($obj) { return array('x' => $obj->x, 'y' => $obj->y); }
$input = array(
array('x' => 0.5, 'y' => 23),
array('x' => 23, 'y' => 21.75),
array('x' => 14.25, 'y' => 21.875),
array('x' => 19.375, 'y' => 21.75),
array('x' => 9.125, 'y' => 21.875),
array('x' => 23, 'y' => 19.625),
array('x' => 19.375, 'y' => 19.625)
);
$output = array_map('xKey_to_array',
array_unique(array_map('array_to_xKey', $input)));
print_r($output);
.
结果:
Array
(
[0] => Array
(
[x] => 0.5
[y] => 23
)
[1] => Array
(
[x] => 23
[y] => 21.75
)
[2] => Array
(
[x] => 14.25
[y] => 21.875
)
[3] => Array
(
[x] => 19.375
[y] => 21.75
)
[4] => Array
(
[x] => 9.125
[y] => 21.875
)
)
. 对数组执行迭代检查时,性能会受到拖累 in_array()
随着临时查找数组大小的增加,情况会逐渐恶化。
考虑到这一点,使用临时关联键来识别后续的重复项,以便 !isset()
可以调用您的增长结果变量。因为 php 数组是哈希映射,所以该技术将始终优于 in_array()
.
这些临时键存在一个问题,专门适用于您的浮点类型值。 当浮点数用作数组键时,php 会通过截断(“flooring”而不是“rounding”)将它们转换为整数。为了避免这种不必要的副作用,请在临时键前面添加一个非数字字符(当然,连字符除外),以便浮点数变成字符串。
代码:(演示)
$array = [
['x' => 0.5, 'y' => 23],
['x' => 23, 'y' => 21.75],
['x' => 14.25, 'y' => 21.875],
['x' => 19.375, 'y' => 21.75],
['x' => 9.125, 'y' => 21.875],
['x' => 23, 'y' => 19.625],
['x' => 19.375, 'y' => 19.625],
];
foreach ($array as $row) {
if (!isset($result['#' . $row['y']])) {
$result['#' . $row['y']] = $row;
}
}
var_export(array_values($result));
输出:
array (
0 =>
array (
'x' => 0.5,
'y' => 23,
),
1 =>
array (
'x' => 23,
'y' => 21.75,
),
2 =>
array (
'x' => 14.25,
'y' => 21.875,
),
3 =>
array (
'x' => 23,
'y' => 19.625,
),
)
附注如果将字符串或整数值作为临时键处理,则无需在前面添加任何字符。如果您不关心从结果中删除临时键(因为您只访问子数组值“down script”,那么您不需要调用 array_values()
迭代后。
array_unique(my_array, SORT_REGULAR)
. 不隶属于 StackOverflow