Eu tenho uma variedade de objetos de gatos:
$cats = Array
(
[0] => stdClass Object
(
[id] => 15
),
[1] => stdClass Object
(
[id] => 18
),
[2] => stdClass Object
(
[id] => 23
)
)
e quero extrair uma matriz de identificações de gatos em 1 linha (não uma função nem um loop).
Eu estava pensando em usar array_walk
com create_function
mas eu não sei como fazê-lo.
Qualquer ideia?
Respostas:
Se você possui PHP 5.5 ou posterior , a melhor maneira é usar a função incorporada
array_column()
:Mas o filho tem que ser uma matriz ou convertido em uma matriz
fonte
array_column
não funcionam com umarray
deobject
s. Como o PHP 7.0.0 é possível: stackoverflow.com/a/23335938/655224Você pode usar a
array_map()
funçãoIsso deve servir:
fonte
$project_names = array_map(function($project) { return $project->name ;}, $projects );
No entanto, neste post do blog , é possível notar que pode ser 2,5 vezes mais lento / com uso intenso de memória.create_function
a memória está crescendo. Se você escrever um programa com loops infinitos e chamar oarray_map
comcreate_function
ele, sempre haverá umOut of memory...
erro em algum momento. Então não usecreate_function
e usearray_map(function($o) { return $o->id; }, $objects);
A solução depende da versão do PHP que você está usando. Pelo menos existem 2 soluções:
Primeiro (versões mais recentes do PHP)
Como o @JosepAlsina disse antes, a melhor e mais curta solução é usar da
array_column
seguinte maneira:Nota: Para iterar um es
array
contendo,\stdClass
conforme usado na pergunta, só é possível com versões do PHP>= 7.0
. Mas ao usar um sarray
contendoarray
você pode fazer o mesmo desde o PHP>= 5.5
.Segundo (versões mais antigas do PHP)
O @Greg disse que em versões mais antigas do PHP é possível fazer o seguinte:
Mas cuidado: nas versões mais recentes do PHP
>= 5.3.0
é melhor usarClosure
s, como se segue:A diferença
A primeira solução cria uma nova função e a coloca na sua RAM. O coletor de lixo não exclui a instância da função já criada e chamada de memória por algum motivo. E isso, independentemente do fato, que a instância da função criada nunca poderá ser chamada novamente, porque não temos ponteiros para ela. E na próxima vez em que esse código for chamado, a mesma função será criada novamente. Esse comportamento preenche lentamente sua memória ...
Ambos os exemplos com saída de memória para compará-los:
RUIM
BOA
Isso também pode ser discutido aqui
Vazamento de memória?! O Garbage Collector está fazendo certo ao usar 'create_function' em 'array_map'?
fonte
array_column
-lo, ele sempre retorna em branco, enquanto ESTE trecho funciona corretamente, ambos têm a propriedade protegida, acessível no segundo trecho só. Não encontrei outro motivo além do namespace.object
na minha solução, quero dizer queobject
nãoObject
. As letras minúsculasobject
descrevem o objeto simples\stdClass
. Talvez esse seja o problema. O seuObject
tem umtoArray
método? Usa isto. Um simplesobject
e umarray
é quase o mesmo. Após invariante deve ser válido:((object)(array)$o) === $o
. Ao implementar o__get
método, você tornará suas propriedades de classe acessíveis a todos. Este pode ser o comportamento esperado. Mas você também pode iterar sobre o seuarray<Object>
ex comarray_map
e chamadatoArray
(se existir) e, em seguida, ele também funcionae use-o em uma linha :
fonte
array_walk
.CÓDIGO
RESULTADO
Eu sei que está usando um loop, mas é a maneira mais simples de fazer isso! E usando uma função, ela ainda acaba em uma única linha.
fonte
Você pode fazer isso facilmente com brindes ouzo
ou com matrizes (de guloseimas ouzo)
Confira: http://ouzo.readthedocs.org/en/latest/utils/functions.html#extract
Veja também programação funcional com ouzo (não consigo postar um link).
fonte
Os loops embutidos no PHP são mais rápidos que os loops interpretados, portanto, faz sentido fazer deste um uma linha:
fonte
fonte
Saída : [1, 2]
fonte
A
create_function()
função está obsoleta no php v7.2.0 . Você pode usar oarray_map()
dado,Como alternativa, você pode usar a
array_column()
função que retorna os valores de uma única coluna da entrada, identificada pela column_key. Opcionalmente, uma index_key pode ser fornecida para indexar os valores na matriz retornada pelos valores da coluna index_key da matriz de entrada. Você pode usar o array_column como determinado,fonte