LoginSignup
3
3

【PHP】さまざまなソートの仕方を説明してみる

Last updated at Posted at 2023-11-07

概要

この記事ではいくつかのソート方法について初学者にもわかりやすいように説明していきます。
また、初学者が分かりにくい単語にはリンクもついておりますのでご活用ください。

目次

ソートとは

sort
物事を整理したり種類によって別々にすることで、
動詞で「分類する、整理する」を意味します。
参考:https://talking-english.net/sort/#google_vignette

そして、プログラミングでのソートとは、小さい順、大きい順、アルファベット順など、特定のルールに従って、データを並べることを意味します。

ソートの種類

PHPには配列をソートする関数が複数用意されています。
配列のキーでソートするものと、値でソートするものがあります。 $array['キー'] = '値';
使う際には何を基準にどのようにソートするのかを考えて、複数ある関数から選ぶ必要があります。
以下がPHPのソートの関数の一覧です。

関数名 ソートの基準 キーと値の相関関係 ソート順
array_multisort() 文字列がキーの場合は維持し、数値添字配列の場合は維持しない 最初の配列、あるいはソートオプション
asort() 維持する 昇順
arsort() 維持する 降順
krsort() キー 維持する 降順
ksort() キー 維持する 昇順
natcasesort() 維持する 大文字小文字を区別しない自然順
natsort() 維持する 自然順
rsort() 維持しない 降順
shuffle() 維持しない ランダム
sort() 維持しない 昇順
uasort() 維持する ユーザー定義
uksort() キー 維持する ユーザー定義
usort() 維持しない ユーザー定義

次はこれらの一部を細かく説明していきたいと思います。

ソートの基準が値のもの

asort()

この関数はキーと値の関係を維持したまま値に基づいて昇順に並べ替えます。

<?php
$fruit = array("d" => "lemon", "a" => "peach", "b" => "grape", "c" => "apple");
asort($fruits);

var_dump($fruits);
?>

上の出力結果は以下の通りです。

array(4) {

  ["c"]=>
  string(5)"apple"
  ["b"]=>
  string(5)"grape"
  ["d"]=>
  string(5)"lemon"
  ["a"]=>
  string(5)"peach"
}

値であるフルーツの名前に沿ってa-zの順に並べています。

sort()

値を基に昇順で並び替えをするという点では、asort()と同じですが、
キーと値の関係を維持せず並び替えるという点で異なります。

<?php
$fruit = array("d" => "lemon", "a" => "peach", "b" => "grape", "c" => "apple");
sort($fruits);

var_dump($fruits);
?>

上の出力結果は以下の通りです。

array(4) {

  [0]=>
  string(5)"apple"
  [1]=>
  string(5)"grape"
  [2]=>
  string(5)"lemon"
  [3]=>
  string(5)"peach"
}

先程述べたようにキーと値の関係を維持せず、キーが新たに自動的に割り当てられます。ただしこの時注意したいのは単純にキーを並べ替える代わりに、すでに割り当てられている既存のキーを削除してしまうという点です。

arsort()

この関数ではキーと値の相関関係を維持したまま値を基準に降順でソートします。

<?php
$fruit = array("d" => "lemon", "a" => "peach", "b" => "grape", "c" => "apple");
arsort($fruits);

var_dump($fruits);
?>

上の出力結果は以下の通りです。

array(4) {

  ["a"]=>
  string(5)"peach"
  ["d"]=>
  string(5)"lemon"
  ["b"]=>
  string(5)"grape"
  ["c"]=>
  string(5)"apple"
}

値であるフルーツの名前に沿ってz-aの順に並べています。

rsort()

値を基に降順で並び替えをするという点では、arsort()と同じですが、
キーと値の関係を維持せず並び替えるという点で異なります。

<?php
$fruit = array("d" => "lemon", "a" => "peach", "b" => "grape", "c" => "apple");
rsort($fruits);

var_dump($fruits);
?>

上の出力結果は以下の通りです。

array(4) {

  [0]=>
  string(5)"peach"
  [1]=>
  string(5)"lemon"
  [2]=>
  string(5)"grape"
  [3]=>
  string(5)"apple"
}

キーと値の関係を維持せず、キーが新たに自動的に割り当てられます。ただしこの時注意したいのは単純にキーを並べ替える代わりに、すでに割り当てられている既存のキーを削除してしまうという点です。

natsort()

この関数は、人間が行うような手法でアルファベットまたは数字の文字列の順番を キー/値の関係を保持したままソートします。

<?php
$array1 = array("img11.png", "img15.png", "img2.png", "img1.png");

natsort($array1);
print_r($array1);
?>

上の出力結果は以下の通りです。

Array
(
    [3] => img1.png
    [2] => img2.png
    [0] => img11.png
    [1] => img15.png
)

もしも同じ配列$array1asort()で並び替えた時の出力結果は以下のようになります

Array
(
    [3] => img1.png
    [0] => img11.png
    [1] => img15.png
    [2] => img2.png
)

出力例を見るとasort()の場合は数字の桁数などを考慮していないのに対し、
natsort()の場合は数字の桁数などを考慮した並び替えができます。
またnatcasesort()は大文字や小文字を区別しない自然順に並べ替えることができるため、
ImGやiMG,imgなどが混ざったような配列でも上記のように自然順に並べ替えることができます。

ソートの基準がキーのもの

ksort()

キーを基準にして、昇順で並び替えます。

<?php
$fruit = array("d" => "lemon", "a" => "peach", "b" => "grape", "c" => "apple");
ksort($fruits);

var_dump($fruits);
?>

上の出力結果は以下の通りです。

array(4) {

  ["a"]=>
  string(5)"peach"
  ["b"]=>
  string(5)"grape"
  ["c"]=>
  string(5)"apple"
  ["d"]=>
  string(5)"lemon"
}

キーを基準にして昇順で並び替えるのでキーがa-dの順に並んでいます。

krsort()

キーを基準にして、降順で並び替えます。

<?php
$fruit = array("d" => "lemon", "a" => "peach", "b" => "grape", "c" => "apple");
krsort($fruits);

var_dump($fruits);
?>

上の出力結果は以下の通りです。

array(4) {

  ["d"]=>
  string(5)"lemon"
  ["c"]=>
  string(5)"apple"
  ["b"]=>
  string(5)"grape"
  ["a"]=>
  string(5)"peach"
}

キーを基準にして降順で並び替えるのでキーがd-aの順に並んでいます。

終わりに

PHPのドキュメントを読んでみたのですが、比較的わかりやすいため読んでみるとより詳しく知ることができると思われます。
何か不備などございましたら、コメントいただけると幸いです。
ここまで読んでいただきありがとうございます。

参考

3
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3