Estoy filtrando una matriz que tiene el mismo valor para la clave, por ejemplo, Javascript
var sims = [{icon:"sim"},{icon:"airtime"},{icon:"sim"}] sims.reduce((a,v)=>{ var exists = a.some((i)=>{ return i.icon == v.icon }) if(!exists){ a.push(v); } return a },[]) Entonces, el código anterior funciona perfectamente bien y obtuve resultados 
Pero no puedo hacer lo mismo en php. He usado la función php array_reduce pero no puedo entender su funcionamiento porque estoy más desconcertado con su sintaxis.
Esto es lo que probé Php
<?php $cars = array(array("icon"=>'sim'),array("icon"=>'airtime'),array("icon"=>'sim')); $container = array(); $unique_types = array_unique(array_map(function($elem){return $elem['icon'];}, $cars)); echo json_encode($unique_types); ?>Lo que me da salida
["sim","airtime"]Me está dando elementos únicos que quiero pero no me devuelve el objeto completo como en Javascript. ¿Qué me estoy perdiendo?
Puede lograr esto de varias maneras, ya que su matriz nunca cambia, puede usar el indicador SORT_REGULAR para comparar elementos normalmente .
// [{"icon":"sim"},{"icon":"airtime"}] echo json_encode(array_unique($cars, SORT_REGULAR));Esto se menciona en la documentación bajo "BANDERAS".
Lo anterior solo comparará que toda la matriz es la misma . Si su matriz se hace más grande, es posible que desee que solo sea única en función de la clave del icon .
// [{"icon":"sim"},{"icon":"airtime"}] echo json_encode(array_intersect_key($cars, array_unique(array_column($cars, 'icon')))); Puede leer sobre array_column y array_intersect_key . Esencialmente, array_column está haciendo su lógica array_map , que luego lo único que faltaba es mapear esas claves nuevamente.
Muchas maneras de hacer esto, por ejemplo, intente esto:
$cars = array( array("icon"=>'sim'), array("icon"=>'airtime'), array("icon"=>'sim')); echo json_encode(array_map("unserialize", array_unique(array_map("serialize", $cars))));Consulte la documentación de estas funciones, las explicaciones son bastante sencillas. Espero que esto ayude.
En el lugar del agujero en el idioma donde debería estar array_uunique() [nuevamente, esto nunca se implementó], puede usar una peculiaridad de las matrices asociativas de PHP para hacer cumplir la unicidad.
$cars = array(array("icon"=>'sim'),array("icon"=>'airtime'),array("icon"=>'sim')); // duplicate indexes are overwritten $index = array_flip(array_column($cars, 'icon')); $out = []; foreach($index as $i) { $out[] = $cars[$i]; } var_dump($out);Producción:
array(2) { [0]=> array(1) { ["icon"]=> string(3) "sim" } [1]=> array(1) { ["icon"]=> string(7) "airtime" } }Árbitro: