php过滤数组值并从多维数组中删除重复项

时间:2014-02-24 23:07:45

标签: php multidimensional-array array-unique

大家好我试图从这个数组中找到重复的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)));    

4 个答案:

答案 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)