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_walk
con create_function
pero 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_column
no funciona con unaarray
deobject
s 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_function
la memoria está creciendo. Si escribe un programa con bucles infinitos y llama alarray_map
concreate_function
en él, siempre recibirá unOut of memory...
error en algún momento. Así que no usecreate_function
y 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_column
lo siguiente:Aviso: Para iterar un es que
array
contiene\stdClass
como se usa en la pregunta, solo es posible con versiones de PHP>= 7.0
. Pero cuando usas un s quearray
contienearray
puedes 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.0
es mejor usarClosure
s, 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_column
en 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.object
en mi solución me refiero aobject
no unObject
. Las minúsculasobject
describen el objeto simple\stdClass
. Tal vez ese sea el problema. ¿Object
Tienes untoArray
método? Utilizar este. Un simpleobject
y unarray
es casi lo mismo. Siguiendo invariante debe ser válido:((object)(array)$o) === $o
. Al implementar el__get
mé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_map
y 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