你好,所有我试图从这个数组中找到重复的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)
.
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top