Pergunta

Olá a todos estou tentando achar duplicados valores de x a partir desta matriz e retire-os e deixe somente o os únicos.Por exemplo, a minha matriz é

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

Então o que precisa acontecer é a percorre toda a coisa e ver o primeiro valor de x como .5, em seguida, continuar e tudo o mais que tem x como .5 removê-lo a partir da matriz de modo a que no final eu tenho uma matriz que se parece com isso

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

onde todos os valores de X são únicos.Eu procurei na internet e encontrei esta função para usar, mas isso não parece funcionar:

 $result = array_map("unserialize", array_unique(array_map("serialize", $array)));    
Foi útil?

Solução

Basta percorrer e encontrar valores exclusivos como você vai:

$taken = array();

foreach($items as $key => $item) {
    if(!in_array($item['x'], $taken)) {
        $taken[] = $item['x'];
    } else {
        unset($items[$key]);
    }
}

A primeira vez que o x valor é usado, podemos salvá-lo - e a subsequente usos são unset a partir da matriz.

Outras dicas

array_unique compara valores de seqüência de caracteres, então você pode criar objetos (com um sobrecarregado __toString função) como um passo intermediário.

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);

O resultado:

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
        )

)

Ao realizar iterado verifica em matrizes, o desempenho arraste com in_array() vai progressivamente piorar à medida que a sua temporária de pesquisa de matriz aumenta de tamanho.

Com isso em mente, use temporária associativa chaves para identificar subsequentes duplicatas para que !isset() pode ser chamado no seu crescimento variável de resultado.Como o php, arrays são hash mapas, esta técnica vai superar consistentemente in_array().

Há uma pegadinha com estas chaves temporárias que se aplica especificamente para o seu tipo flutuante valores. Quando flutua são usados como chaves de matriz, o php irá convertê-las para números inteiros por truncar ("piso", e não "arredondamento").Para evitar esta indesejável efeito colateral, acrescentar um caractere não-numérico (diferente de um hífen, é claro) para o chaves temporárias, de modo a que a bóia se torna uma seqüência de caracteres.

Código:(Demonstração)

$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));

Saída:

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.Se lidar com a cadeia de caracteres ou valores de número inteiro como temporay chaves não é necessário preceder quaisquer caracteres.Se você não se preocupa sobre como remover as chaves temporárias do resultado (porque você é só acessar o subarray valores "para baixo" script e, em seguida, você não precisa chamar array_values() após a iteração.

array_unique(my_array, SORT_REGULAR)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top