Tengo una gran variedad de objetos de gatos:
$cats = Array
(
[0] => stdClass Object
(
[id] => 15
),
[1] => stdClass Object
(
[id] => 18
),
[2] => stdClass Object
(
[id] => 23
)
)
y quiero extraer una matriz de ID de gatos en 1 línea (no es una función ni un bucle).
Estaba pensando en usar array_walkcon create_functionpero no sé cómo hacerlo.
¿Alguna idea?

Respuestas:
Si tiene PHP 5.5 o posterior , la mejor manera es usar la función integrada
array_column():Pero el hijo tiene que ser una matriz o convertirse en una matriz
fuente
array_columnno funciona con unaarraydeobjects en absoluto. Como PHP 7.0.0 es posible: stackoverflow.com/a/23335938/655224Puedes usar la
array_map()función.Esto debería hacerlo:
fuente
$project_names = array_map(function($project) { return $project->name ;}, $projects );Sin embargo, se señala en esta publicación de blog que podría ser 2.5 veces más lento / memoria intensiva de esta manera.create_functionla memoria está creciendo. Si escribe un programa con bucles infinitos y llama alarray_mapconcreate_functionen él, siempre recibirá unOut of memory...error en algún momento. Así que no usecreate_functiony usearray_map(function($o) { return $o->id; }, $objects);La solución depende de la versión de PHP que esté utilizando. Al menos hay 2 soluciones:
Primero (versiones PHP más recientes)
Como @JosepAlsina dijo antes, la mejor y más corta solución es usar
array_columnlo siguiente:Aviso: Para iterar un es que
arraycontiene\stdClasscomo se usa en la pregunta, solo es posible con versiones de PHP>= 7.0. Pero cuando usas un s quearraycontienearraypuedes hacer lo mismo desde PHP>= 5.5.Segundo (versiones anteriores de PHP)
@ Greg dijo en versiones anteriores de PHP que es posible hacer lo siguiente:
Pero cuidado: en las versiones más recientes de PHP
>= 5.3.0es mejor usarClosures, como sigue:La diferencia
La primera solución crea una nueva función y la pone en su RAM. El recolector de basura no elimina de la memoria la instancia de función ya creada y llamada por alguna razón. Y eso, independientemente del hecho, que la instancia de función creada nunca se puede volver a llamar, porque no tenemos un puntero para ella. Y la próxima vez que se invoque este código, se volverá a crear la misma función. Este comportamiento llena lentamente tu memoria ...
Ambos ejemplos con salida de memoria para compararlos:
MALO
BUENO
Esto también se puede discutir aquí
¡¿Pérdida de memoria?! ¿Garbage Collector funciona correctamente cuando usa 'create_function' dentro de 'array_map'?
fuente
array_columnen esta matriz siempre vuelve en blanco, mientras que ESTE fragmento funciona correctamente, ambos tienen la propiedad protegida que es accesible en el segundo fragmento solamente. No pude encontrar otra razón que el espacio de nombres.objecten mi solución me refiero aobjectno unObject. Las minúsculasobjectdescriben el objeto simple\stdClass. Tal vez ese sea el problema. ¿ObjectTienes untoArraymétodo? Utilizar este. Un simpleobjecty unarrayes casi lo mismo. Siguiendo invariante debe ser válido:((object)(array)$o) === $o. Al implementar el__getmétodo, hará que sus propiedades de clase sean accesibles para todos. Este puede ser el comportamiento esperado. Pero también puede iterar sobre suarray<Object>eg conarray_mapy llamartoArray(si existe) y luego también funcionay úsalo en una línea :
fuente
array_walk.CÓDIGO
SALIDA
Sé que está usando un bucle, ¡pero es la forma más sencilla de hacerlo! Y usando una función todavía termina en una sola línea.
fuente
Puedes hacerlo fácilmente con ouzo goodies
o con matrices (de golosinas ouzo)
Echa un vistazo: http://ouzo.readthedocs.org/en/latest/utils/functions.html#extract
Vea también programación funcional con ouzo (no puedo publicar un enlace).
fuente
Los bucles incorporados en PHP son más rápidos que los bucles interpretados, por lo que en realidad tiene sentido hacer que este sea una línea:
fuente
fuente
Salida : [1, 2]
fuente
La
create_function()función está en desuso a partir de php v7.2.0 . Puede usar elarray_map()como se indica,Alternativamente, puede usar la
array_column()función que devuelve los valores de una sola columna de la entrada, identificada por column_key. Opcionalmente, se puede proporcionar una index_key para indexar los valores en la matriz devuelta por los valores de la columna index_key de la matriz de entrada. Puede usar el array_column como se indica,fuente