Hola a todos, estoy intentando encontrar valores x duplicados de esta matriz y eliminarlos y dejar solo los únicos. Por ejemplo mi matriz es
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 ) )
Entonces, lo que necesito que suceda es que los bucles atraviesen todo el asunto y vean el primer valor de x como .5, luego continúe y lo que sea que tenga x como .5 lo elimine de la matriz para que al final tenga una matriz como esta
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 ) )
Donde todos los valores de X son únicos. Busqué en línea y encontré esta función para usar, pero esto no parece funcionar:
$result = array_map("unserialize", array_unique(array_map("serialize", $array)));
Simplemente recorre y encuentra valores únicos a medida que avanzas:
$taken = array(); foreach($items as $key => $item) { if(!in_array($item['x'], $taken)) { $taken[] = $item['x']; } else { unset($items[$key]); } }
Cada vez que se usa el valor x
, lo guardamos, y los usos subsiguientes se unset
de la matriz.
array_unique
compara valores de cadena, por lo que puede crear objetos (con una función sobrecargada __toString
) como un paso intermedio.
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);
El 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 ) )
array_unique(my_array, SORT_REGULAR)