大家好我试图从这个数组中找到重复的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)));
答案 0 :(得分:4)
随时循环查找唯一值:
$taken = array();
foreach($items as $key => $item) {
if(!in_array($item['x'], $taken)) {
$taken[] = $item['x'];
} else {
unset($items[$key]);
}
}
每次第一次使用x
值时,我们都会保存它 - 后续用法是数组中的unset
。
答案 1 :(得分:0)
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
)
)
答案 2 :(得分:0)
对数组执行迭代检查时,in_array()
对性能的拖累会随着临时查找数组大小的增加而逐渐恶化。
考虑到这一点,请使用临时关联键来标识后续的重复项,以便可以在您不断增长的结果变量上调用!isset()
。由于php数组是哈希映射,因此该技术的性能将始终优于in_array()
。
存在一个带有这些临时键的陷阱,这些临时键专门适用于您的float类型值。当将float用作数组键时,php会通过截断将它们转换为整数(“ flooring”而不是“ rounding” ”)。为避免这种不必要的副作用,请在临时键之前加上一个非数字字符(当然不是连字符),以便浮点数成为字符串。
代码:(Demo)
$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,
),
)
p.s。如果将字符串或整数值作为临时键处理,则无需在前面加上任何字符。如果您不关心从结果中删除临时键(因为您只访问子数组值“向下脚本”,则不需要在迭代后调用array_values()
。
答案 3 :(得分:-2)
array_unique(my_array, SORT_REGULAR)