PHP 8.4 está previsto para ser lançado em novembro de 2024 e apresentará algumas novas funções de array úteis:
Neste artigo, daremos uma rápida olhada nessas novas funções e como você poderá usá-las em seus projetos rodando PHP 8.4.
Se você é um desenvolvedor Laravel, pode notar que já temos funções semelhantes nas classes Illuminate\Support\Collection e Illuminate\Support\Arr. Mas adoro que essas funções sejam nativas do PHP e, portanto, estarão disponíveis em qualquer projeto PHP.
Para qualquer um dos meus leitores que são desenvolvedores Laravel, mostrarei os equivalentes Laravel dessas novas funções para que você possa obter a mesma funcionalidade em seus projetos Laravel sem ter que esperar pelo PHP 8.4.
Você também pode estar interessado em conferir meu outro artigo que fala tudo sobre o novo recurso "property hooks" do PHP 8.4.
A função array_find retorna o valor do primeiro elemento que corresponde aos critérios definidos no retorno de chamada. Se nenhum elemento corresponder ao retorno de chamada, a função retornará nulo.
Vamos dar uma olhada em um exemplo simples. Vamos imaginar que temos uma variedade de produtos e que queremos encontrar o produto com o código de barras 123456:
$products = [ [ 'name' => 'Macbook Pro', 'type' => 'Laptop', 'barcode' => 123456, ], [ 'name' => 'Framework Laptop 13', 'type' => 'Laptop', 'barcode' => 789012, ], [ 'name' => 'Samsung Galaxy S24', 'type' => 'Phone', 'barcode' => 135791, ], ]; // Find the product with barcode 123456 $findProduct = array_find( array: $products, callback: function (array $product): bool { return $product['barcode'] == 123456; }, );
Depois de executar o código acima, $findProduct será igual a:
[ 'name'=> 'Macbook Pro', 'type' => 'Laptop', 'barcode' => 123456, ]
Poderíamos limpar isso um pouco mais usando uma função de seta como segundo argumento:
$findProduct = array_find( array: $products, callback: fn (array $product): bool => $product['barcode'] === 123456, );
O código acima retornará o mesmo resultado do exemplo anterior.
Se nenhum elemento corresponder ao retorno de chamada, a função retornará nulo. Vejamos um exemplo disso:
$nonExistentProduct = array_find( array: $products, callback: fn (array $product): bool => $product['barcode'] === 'invalid', );
Neste caso, $nonExistentProduct será igual a null.
No Laravel, você pode obter um resultado semelhante usando o método Arr::first:
use Illuminate\Support\Arr; $findProduct = Arr::first( $products, fn (array $product): bool => $product['barcode'] === 123456, );
Esta função é semelhante à função array_find, mas em vez de retornar o valor do primeiro elemento que corresponde ao retorno de chamada, ela retorna a chave do primeiro elemento que corresponde ao retorno de chamada.
Vamos pegar nosso array de exemplo $products anterior. Desta vez, queremos encontrar a chave do produto com código de barras 789012:
$products = [ [ 'name' => 'Macbook Pro', 'type' => 'Laptop', 'barcode' => 123456, ], [ 'name' => 'Framework Laptop 13', 'type' => 'Laptop', 'barcode' => 789012, ], [ 'name' => 'Samsung Galaxy S24', 'type' => 'Phone', 'barcode' => 135791, ], ]; // Find the key of the product with barcode 789012 $findProduct = array_find_key( array: $products, callback: fn (array $product): bool => $product['barcode'] === 789012, );
Depois de executar o código acima, $findProduct será igual a 1 porque o produto é o segundo elemento do array.
Se nenhum elemento corresponder ao retorno de chamada, a função retornará nulo. Vejamos um exemplo disso:
$nonExistentProduct = array_find_key( array: $products, callback: fn (array $product): bool => $product['barcode'] === 'invalid', );
Neste caso, $nonExistentProduct será igual a null.
No Laravel, você pode obter um resultado semelhante usando uma combinação dos métodos array_keys e Arr::first:
use Illuminate\Support\Arr; $firstProductKey = Arr::first( array_keys($products), fn (int $key): bool => $products[$key]['barcode'] === 789012, );
No código acima, primeiro usamos array_keys para obter um array de chaves do array $products. Em seguida, usamos Arr::first para encontrar a primeira chave que corresponde ao retorno de chamada. Isso é um pouco mais detalhado do que a função nativa do PHP, mas atinge o mesmo resultado.
A função array_any permite verificar se pelo menos um elemento do array corresponde aos critérios definidos no retorno de chamada. Se algum elemento corresponder ao retorno de chamada, a função retornará verdadeiro. Se nenhum elemento corresponder ao retorno de chamada, a função retornará false.
Continuando com nosso array de exemplo $products, vamos verificar se algum dos produtos tem um tipo de Laptop:
$anyProductsAreLaptops = array_any( array: $products, callback: fn (array $product): bool => $product['type'] === 'Laptop', );
Nesse caso, $anyProductsAreLaptops será igual a true porque pelo menos um dos produtos na matriz é um laptop.
Se nenhum elemento corresponder ao retorno de chamada, a função retornará falso. Vejamos um exemplo disso:
$anyProductsAreInvalid = array_any( array: $products, callback: fn (array $product): bool => $product['type'] === 'Invalid', );
Neste caso, $anyProductsAreInvalid será igual a false.
Podemos obter o mesmo resultado no Laravel usando o método contains em uma coleção:
use Illuminate\Support\Collection; $anyProductsAreLaptops = Collection::make($products)->contains( fn (array $product): bool => $product['type'] === 'Laptop', );
No código acima, estamos criando uma coleção a partir do array $products e, em seguida, usando o método contains para verificar se algum dos produtos da coleção é laptop.
A função array_all é semelhante à função array_any, mas em vez de verificar se pelo menos um elemento corresponde ao retorno de chamada, ela verifica se todos os elementos correspondem ao retorno de chamada. Se todos os elementos corresponderem ao retorno de chamada, a função retornará verdadeiro. Se algum elemento não corresponder ao retorno de chamada, a função retornará false.
Vamos verificar se todos os produtos em nossa matriz $products são laptops:
$allProductsAreLaptops = array_all( array: $products, callback: fn (array $product): bool => $product['type'] === 'Laptop', );
Nesse caso, $allProductsAreLaptops será igual a false porque nem todos os produtos na matriz são laptops.
No Laravel, podemos obter o mesmo resultado usando o método every em uma coleção:
use Illuminate\Support\Collection; $allProductsAreLaptops = Collection::make($products)->every( fn (array $product): bool => $product['type'] === 'Laptop', );
No código acima, estamos criando uma coleção a partir do array $products e, em seguida, usando o método every para verificar se todos os produtos da coleção são laptops.
Esperamos que este artigo tenha mostrado como você pode usar as novas funções de array que estarão disponíveis no PHP 8.4. Também deveria ter dado uma ideia de como você pode obter funcionalidades semelhantes no Laravel usando as classes Illuminate\Support\Collection e Illuminate\Support\Arr.
Se você gostou de ler este post, talvez esteja interessado em conferir meu e-book de 220 páginas "Battle Ready Laravel", que cobre tópicos semelhantes com mais profundidade.
Ou você pode conferir meu outro e-book de 440 páginas "Consumindo APIs no Laravel", que ensina como usar o Laravel para consumir APIs de outros serviços.
Se você estiver interessado em ser atualizado sempre que eu publicar uma nova postagem, sinta-se à vontade para se inscrever no meu boletim informativo.
Continue construindo coisas incríveis! ?
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3