É sempre mais fácil pegar uma informação específica de dados classificados, caso contrário, você terá que passar por cada elemento da matriz, um de cada vez.
Por exemplo, digamos que você armazenou a pontuação de diferentes alunos de uma turma em uma matriz ou tabela. Se os dados não forem ordenados pelas notas obtidas, você terá que olhar a nota de cada aluno da turma antes de poder dizer quem obteve a nota mais alta e a mais baixa. Se a tabela já estiver classificada de baixo para alto com base nas pontuações, basta olhar para a pontuação do primeiro aluno para obter a nota mais baixa.
A classificação torna muitas tarefas que exigem acesso ou obtenção de um conjunto específico de dados muito fáceis e eficientes. Neste tutorial, aprenderemos como usar funções internas do PHP para classificar diferentes tipos de array.
Classificando um array por valor
Ordenar um array pelo valor de seus elementos é muito fácil em PHP. Você pode optar por manter ou descartar associações de valores-chave e também pode definir suas próprias funções para ditar como os elementos são classificados. Mostrarei como nesta seção do tutorial.
Você pode usar o sort(&$array, $sort_flags)
função para classificar os valores de uma matriz de baixo para alto. No entanto, ele não manterá nenhuma associação de valor-chave ao classificar a matriz. Novas chaves são atribuídas a elementos ordenados em vez de uma simples reordenação. O segundo parâmetro opcional permite especificar como os elementos devem ser classificados. Pode ter seis valores diferentes:
-
SORT_REGULAR
—Isso classificará os valores sem alterar seus tipos. -
SORT_NUMERIC
—Isso classificará os valores comparando-os numericamente. -
SORT_STRING
—Isso classificará os valores comparando-os como strings. -
SORT_LOCALE_STRING
—Isso comparará os valores como strings com base na localidade atual. Você mesmo pode atualizar a localidade usandosetlocale()
. -
SORT_NATURAL
—Isso classificará os itens usando “ordenação natural” enquanto os compara como strings. -
SORT_FLAG_CASE
-Pode ser combinado comSORT_STRING
ouSORT_NATURAL
para desativar a diferenciação entre maiúsculas e minúsculas durante a classificação de strings.
Aqui estão alguns exemplos de classificação para ajudá-lo a entender rapidamente a diferença entre todos os sinalizadores de classificação.
No primeiro exemplo, classificação regular, as strings numéricas são convertidas em seus valores numéricos e a classificação é feita de acordo. A string "Apple" não é numérica, por isso é deixada intocada e comparada como uma string.
No segundo exemplo, classificação numérica, queremos que os dados sejam classificados com base no valor numérico, de modo que "Apple" seja convertido para o valor numérico 0 e venha primeiro. O restante dos valores são classificados conforme o esperado.
No terceiro exemplo, todos os valores são tratados como strings. Isso significa que, em vez de comparar o valor numérico de 123 ou 3249832 com 38, eles são comparados como strings — um caractere por vez. Como "1" vem antes de "3", o valor 123 é considerado menor que 38.
Se você quiser classificar seus valores de matriz de alto para baixo em vez de baixo para alto, você pode fazê-lo com a ajuda do
rsort()
função. Ele aceita todos os mesmos parâmetros quesort()
mas classifica os valores na ordem inversa. Ele também não mantém nenhuma associação de valor-chave, portanto, não é uma boa escolha para classificar matrizes associativas.Ordenar uma matriz associativa
As associações de valores-chave tornam-se importantes quando você está lidando com matrizes associativas.
Considere o exemplo a seguir, onde um array associativo é usado para armazenar os nomes de diferentes pessoas e suas frutas favoritas. Se você quiser ordenar a lista alfabeticamente pelos nomes das frutas, usando o
sort()
função da seção anterior resultará na perda das teclas associadas."Orange", "John" => "Banana", "Patricia" => "Apple", "Jennifer" => "Mango", "Mary" => "Grapes"]; echo "Before Sorting — n"; foreach($fruit_preferences as $person=>$preference) { echo $person." likes ".$preference."n"; } /* Before Sorting — James likes Orange John likes Banana Patricia likes Apple Jennifer likes Mango Mary likes Grapes */ sort($fruit_preferences); echo "After Sorting — n"; foreach($fruit_preferences as $person=>$preference) { echo $person." likes ".$preference."n"; } /* After Sorting — 0 likes Apple 1 likes Banana 2 likes Grapes 3 likes Mango 4 likes Orange */ ?>Como você pode ver, não só perdemos a associação das pessoas com sua fruta favorita, como também perdemos os nomes das diferentes pessoas. Cada valor classificado recebeu um novo índice numérico com base em sua posição na matriz classificada.
Para ajudá-lo a resolver esse problema facilmente, o PHP tem duas funções diferentes que mantêm a associação de valor-chave enquanto classificam os arrays por seus valores. Essas duas funções são
asort()
earsort()
. O snippet de código a seguir classifica o mesmo$fruit_preferences
matriz, mas usaasort()
fazer isso."Orange", "John" => "Banana", "Patricia" => "Apple", "Jennifer" => "Mango", "Mary" => "Grapes"]; echo "Before Sorting — n"; foreach($fruit_preferences as $person=>$preference) { echo $person." likes ".$preference."n"; } /* Before Sorting — James likes Orange John likes Banana Patricia likes Apple Jennifer likes Mango Mary likes Grapes */ asort($fruit_preferences); echo "After Sorting — n"; foreach($fruit_preferences as $person=>$preference) { echo $person." likes ".$preference."n"; } /* After Sorting — Patricia likes Apple John likes Banana Mary likes Grapes Jennifer likes Mango James likes Orange */ ?>Como fica evidente no exemplo acima, o valor Maçã se move para o topo, mantendo sua associação com Patrícia. Os nomes das frutas podem ser ordenados ao contrário com a mesma facilidade usando o
arsort()
função.Ambas as funções aceitam os mesmos sinalizadores de classificação como o valor de seu segundo parâmetro opcional como
sort()
ersort()
.Classificando elementos de matriz por valor com funções definidas pelo usuário
As quatro funções de classificação podem lidar facilmente com suas necessidades comuns de classificação com a ajuda de diferentes sinalizadores. No entanto, às vezes seus critérios para comparar os elementos da matriz podem ser diferentes.
Digamos que você tenha uma matriz de palavras aleatórias que precisam ser classificadas em ordem alfabética. No entanto, você também deseja classificá-los com base em seu comprimento antes de classificá-los em ordem alfabética. Por exemplo, jardim zoológico viria depois maçã na ordenação alfabética tradicional. No entanto, se você quiser mostrar as palavras curtas antes das mais longas, jardim zoológico aparecerá antes maçã. No mesmo conjunto de letras, macaco viria antes jardim zoológico devido à ordem alfabética.
Basicamente, as palavras são classificadas primeiro com base em seu comprimento e, em seguida, as palavras com o mesmo número de letras são classificadas em ordem alfabética dentro de seu próprio grupo. Este tipo de ordenação não está embutido no PHP, então teremos que escrever nossa própria função de ordenação.
O que o PHP faz neste caso é fornecer algumas funções que podem ser usadas para passar o array que você deseja classificar, junto com o nome de sua própria função de classificação.
Você pode usar o
usort()
função para classificar valores de matriz em matrizes regulares. Da mesma forma, você pode usar ouasort()
função para classificar valores em matrizes associativas enquanto também mantém associações de valores-chave.O trecho de código abaixo mostra uma maneira de realizar esse comportamento.
strlen($word_b)) { return 1; } } usort($random_words, "custom_sort"); echo "nCustom Sort Function: n"; foreach($random_words as $element) { echo str_pad($element, 9)." "; } /* Custom Sort Function: ape eye pie zoo apple banana picnic elephant */ ?>Nas funções de retorno de chamada destinadas à classificação personalizada, temos que retornar um inteiro menor que 0 para indicar que o primeiro valor é menor que o segundo. Retorna 0 se o primeiro valor for igual ao segundo. Retorna um inteiro maior que 0 se o primeiro valor for maior que o segundo.
Como nosso principal critério de classificação era o comprimento da string, retornamos diretamente -1 se a primeira palavra for menor que a segunda. Da mesma forma, retornamos diretamente 1 se a primeira palavra for maior que a segunda. Se as duas palavras forem iguais em comprimento, nós as comparamos em ordem alfabética usando o
strcmp()
função e retornar seu valor.Como você pode ver na saída, nossa função de classificação personalizada reordena as palavras exatamente da maneira que queríamos.
Classificando um array por chave
Classificar uma matriz com base em suas chaves geralmente é útil quando você está lidando com matrizes associativas.
Por exemplo, você pode ter uma matriz com informações sobre o número total de aeroportos em vários países. Assumindo que os nomes dos diferentes países são chaves e os números dos aeroportos são valores, você pode querer classificar os nomes dos países em ordem alfabética. Isso é muito fácil de fazer com o
ksort()
ekrsort()
funções. Ambas as funções manterão a associação de valor-chave dos elementos da matriz após a classificação. oksort()
função classifica as teclas de baixo para alto ekrsort()
classifica as teclas de alto para baixo.Aqui está um exemplo básico de classificação:
13513, "Brazil" => 4093, "Mexico" => 1714, "Canada" => 1467, "Russia" => 1218, "Argentina" => 1138, "Bolivia" => 855, "Colombia" => 836, "Paraguay" => 799, "Indonesia" => 673]; ksort($airport_count); foreach($airport_count as $country=>$count) { echo str_pad($country, 15)." ".$count."n"; } /* Argentina 1138 Bolivia 855 Brazil 4093 Canada 1467 Colombia 836 Indonesia 673 Mexico 1714 Paraguay 799 Russia 1218 United States 13513 */ ?>Você também pode fornecer ao PHP sua própria função personalizada para classificar chaves de matriz usando o
uksort()
função. Assim comousort()
a função de retorno de chamada emuksort()
também requer que você retorne um inteiro menor que 0 se a primeira chave for considerada menor que a segunda e um inteiro maior que 0 se a primeira chave for maior que a segunda. Essa função também mantém a associação de valor-chave dos elementos da matriz.13513, "Brazil" => 4093, "Mexico" => 1714, "Canada" => 1467, "Russia" => 1218, "Argentina" => 1138, "Bolivia" => 855, "Colombia" => 836, "Paraguay" => 799, "Indonesia" => 673]; function custom_sort($word_a, $word_b) { if (strlen($word_a) < strlen($word_b)) { return -1; } if (strlen($word_a) == strlen($word_b)) { return strcmp($word_a, $word_b); } if (strlen($word_a) > strlen($word_b)) { return 1; } } uksort($airport_count, "custom_sort"); foreach($airport_count as $country=>$count) { echo str_pad($country, 15)." ".$count."n"; } /* Brazil 4093 Canada 1467 Mexico 1714 Russia 1218 Bolivia 855 Colombia 836 Paraguay 799 Argentina 1138 Indonesia 673 United States 13513 */ ?>No exemplo acima, usamos a função de classificação personalizada da seção anterior para classificar os nomes dos países primeiro pelo comprimento do nome e depois em ordem alfabética.
Classificando arrays multidimensionais em PHP
É muito mais comum na vida real lidar com informações multidimensionais. Por exemplo, as instituições armazenarão as notas de todos os alunos em uma variedade de disciplinas em uma única tabela, em vez de criar novas tabelas para cada disciplina. Se você tiver que armazenar as mesmas informações em PHP, também preferirá fazê-lo usando um array multidimensional em vez de um array separado para cada assunto.
Neste tutorial, aprenderemos como classificar um array multidimensional usando uma lista dos edifícios mais altos do mundo como exemplo. Nossa matriz conterá informações sobre o nome do edifício, a cidade e o país onde está localizado, o número de andares e a altura total em metros, juntamente com o ano em que foi construído.
Quando você deseja classificar os valores em uma matriz multidimensional com base em um campo específico, basta usar o
usort()
função. O exemplo abaixo deve ajudá-lo a entender melhor essa técnica."Burj Khalifa","City" => "Dubai","Country" => "United Arab Emirates","Height" => 828,"Floors" => 163,"Year" => 2010], ["Building" => "Shanghai Tower","City" => "Shanghai","Country" => "China","Height" => 632,"Floors" => 128,"Year" => 2015], ["Building" => "Abraj Al-Bait Towers","City" => "Mecca","Country" => "Saudi Arabia","Height" => 601,"Floors" => 120,"Year" => 2012], ["Building" => "Ping An Finance Center","City" => "Shenzhen","Country" => "China","Height" => 599,"Floors" => 115,"Year" => 2017], ["Building" => "Lotte World Tower","City" => "Seoul","Country" => "South Korea" ,"Height" => 554,"Floors" => 123,"Year" => 2016] ]; function storey_sort($building_a, $building_b) { return $building_a["Floors"] - $building_b["Floors"]; } usort($tallest_buildings, "storey_sort"); foreach($tallest_buildings as $tall_building) { list($building, $city, $country, $height, $floors) = array_values($tall_building); echo $building." is in ".$city.", ".$country.". It is ".$height." meters tall with ".$floors." floors.n"; } /* Ping An Finance Center is in Shenzhen, China. It is 599 meters tall with 115 floors. Abraj Al-Bait Towers is in Mecca, Saudi Arabia. It is 601 meters tall with 120 floors. Lotte World Tower is in Seoul, South Korea. It is 554 meters tall with 123 floors. Shanghai Tower is in Shanghai, China. It is 632 meters tall with 128 floors. Burj Khalifa is in Dubai, United Arab Emirates. It is 828 meters tall with 163 floors. */ ?>No exemplo acima, as informações sobre cada edifício são armazenadas em seu próprio array dentro da
$tallest_buildings
variedade. ostorey_sort()
A função simplesmente subtrai o número de andares do segundo prédio do primeiro para determinar qual prédio é menor de acordo com nossos critérios. Não precisamos nos preocupar em retornar um valor negativo ou positivo específico porque todos os valores negativos significam menores e todos os valores positivos significam maiores.No final, apenas iteramos o array principal e imprimimos informações sobre cada edifício.
Pensamentos finais
Neste tutorial, mostrei algumas funções diferentes em PHP que podem ser usadas para classificar arrays por suas chaves ou seus valores. Também aprendemos como classificar uma matriz por suas chaves ou valores usando nossos próprios critérios de classificação personalizados com a ajuda do
uksort()
euasort()
funções. A seção final discutiu como classificar todos os valores em uma matriz multidimensional usando apenas um campo específico.Espero que você tenha aprendido algo novo com este tutorial. Se você tiver alguma dúvida ou sugestão, por favor, deixe-me saber nos comentários. A melhor maneira de aprender é tentar criar alguns exemplos próprios, ordenando arrays usando essas funções.
Originally posted 2022-07-01 01:56:46.