PHPプログラミング

最終更新日:
公開日:

レシピ

配列

配列を逆順に並び替える

array_reverse関数を使って、配列に入っている要素の並びを逆順にする方法について解説します。

この記事のポイント

  • 連想配列にも同じように使用できる
  • 多次元配列のソートはもっとも外側のみ並び替える

目次

配列の並びを逆にする

array_reverse関数は渡した配列の並びを反転します。

コード例

$array = array_reverse( $array);

sort関数などはソートを行うと引数で渡した配列を直に並び替えを行いますが、こちらの関数は返り値として並び替えた配列を返す仕様になっているため、並び替えた配列を変数で受け取る必要があります。
上記のコード例では元の配列が入っていた変数に並び替えた後の配列をそのまま格納しています。

コード例

<?php

// 配列を用意
$array = array( '柴犬', 'ポメラニアン', 'ゴールデンレトリバー', 'グレイハウンド', 'シベリアンハスキー');

// ソート前の配列を出力
var_dump($array);

// ソート実行
$array = array_reverse($array);

// ソート後の配列を出力
var_dump($array);

ソート前の配列の出力例

array(5) {
   [0]=> string(6) "柴犬"
   [1]=> string(18) "ポメラニアン"
   [2]=> string(30) "ゴールデンレトリバー"
   [3]=> string(21) "グレイハウンド"
   [4]=> string(27) "シベリアンハスキー"
}

ソート後の配列の出力例

array(5) {
    [0]=> string(27) "シベリアンハスキー"
    [1]=> string(21) "グレイハウンド"
    [2]=> string(30) "ゴールデンレトリバー"
    [3]=> string(18) "ポメラニアン"
    [4]=> string(6) "柴犬"
}

意図した通りに配列の要素の並びが反対になりました。
配列の添字は先頭が「0」から始まる形に振り直されていますが、ソート前の添字をそのまま引き継ぎたい場合は第2パラメータに論理値で「true」を指定してください。

コード例

<?php

// 配列を用意
$array = array( '柴犬', 'ポメラニアン', 'ゴールデンレトリバー', 'グレイハウンド', 'シベリアンハスキー');

// ソート実行
$array = array_reverse($array, true);

// ソート後の配列を出力
var_dump($array);

ソート後の配列の出力例

array(5) {
    [4]=> string(27) "シベリアンハスキー"
    [3]=> string(21) "グレイハウンド"
    [2]=> string(30) "ゴールデンレトリバー"
    [1]=> string(18) "ポメラニアン"
    [0]=> string(6) "柴犬"
}

連想配列を並び替える

連想配列についても、同じようにarray_reverse関数を使用することができます。

コード例

<?php

// 配列を用意
$array = array(
	'dog1' => '柴犬',
	'dog2' => 'ポメラニアン',
	'dog3' => 'ゴールデンレトリバー',
	'dog4' => 'グレイハウンド',
	'dog5' => 'シベリアンハスキー'
);

// ソート前の配列を出力
var_dump($array);

// ソート実行
$array = array_reverse($array);

// ソート後の配列を出力
var_dump($array);

多次元配列を並び替える

多次元配列に対してarray_reverse関数を使用すると一番外側の要素のみを並び替えます。

コード例

<?php

// 配列を用意
$array = array(
	array(
		'id' => 1,
		'name' => '柴犬',
		'age' => 8,
		'regist_datetime' => '2017-02-01 10:00'
	),
	array(
		'id' => 2,
		'name' => 'ポメラニアン',
		'age' => 3,
		'regist_datetime' => '2017-02-15 10:00'
	),
	array(
		'id' => 5,
		'name' => 'ゴールデンレトリバー',
		'age' => 8,
		'regist_datetime' => '2017-02-16 15:00'
	),
	array(
		'id' => 6,
		'name' => 'グレイハウンド',
		'age' => 6,
		'regist_datetime' => '2017-02-16 16:30'
	),
	array(
		'id' => 8,
		'name' => 'シベリアンハスキー',
		'age' => 3,
		'regist_datetime' => '2017-02-16 19:00'
	)
);

// ソート実行
$array = array_reverse($array);

// ソート後の配列を出力
var_dump($array);

ソート後の配列の出力例

array(5) {
    [0]=> array(4) {
        ["id"]=> int(8)
        ["name"]=> string(27) "シベリアンハスキー"
        ["age"]=> int(3)
        ["regist_datetime"]=> string(16) "2017-02-16 19:00"
    }
    [1]=> array(4) {
        ["id"]=> int(6)
        ["name"]=> string(21) "グレイハウンド"
        ["age"]=> int(6)
        ["regist_datetime"]=> string(16) "2017-02-16 16:30"
    }
    [2]=> array(4) {
        ["id"]=> int(5)
        ["name"]=> string(30) "ゴールデンレトリバー"
        ["age"]=> int(8)
        ["regist_datetime"]=> string(16) "2017-02-16 15:00"
    }
    [3]=> array(4) {
        ["id"]=> int(2)
        ["name"]=> string(18) "ポメラニアン"
        ["age"]=> int(3)
        ["regist_datetime"]=> string(16) "2017-02-15 10:00"
    }
    [4]=> array(4) {
        ["id"]=> int(1)
        ["name"]=> string(6) "柴犬"
        ["age"]=> int(8)
        ["regist_datetime"]=> string(16) "2017-02-01 10:00"
    }
}

ソートした後の配列を出力して確認すると、全体的な並びは逆転していますが子要素「id」「name」などの並びには変化がないことが分かります。
もし子要素に対して並び替えを行いたい場合は、次のコード例のように行います。

コード例

<?php

// 配列を宣言
$array = array(
	array(
		'id' => 1,
		'name' => '柴犬',
		'age' => 8,
		'regist_datetime' => '2017-02-01 10:00'
	),
	array(
		'id' => 2,
		'name' => 'ポメラニアン',
		'age' => 3,
		'regist_datetime' => '2017-02-15 10:00'
	),
	array(
		'id' => 5,
		'name' => 'ゴールデンレトリバー',
		'age' => 8,
		'regist_datetime' => '2017-02-16 15:00'
	),
	array(
		'id' => 6,
		'name' => 'グレイハウンド',
		'age' => 6,
		'regist_datetime' => '2017-02-16 16:30'
	),
	array(
		'id' => 8,
		'name' => 'シベリアンハスキー',
		'age' => 3,
		'regist_datetime' => '2017-02-16 19:00'
	)
);

foreach( $array as $key => $c_array) {
	$array[$key] = array_reverse($c_array);
}

// ソート後の配列を出力
var_dump($array);

ソート後の配列の出力例

array(5) {
    [0]=> array(4) {
        ["regist_datetime"]=> string(16) "2017-02-01 10:00"
        ["age"]=> int(8)
        ["name"]=> string(6) "柴犬"
        ["id"]=> int(1)
    }
    [1]=> array(4) {
        ["regist_datetime"]=> string(16) "2017-02-15 10:00"
        ["age"]=> int(3)
        ["name"]=> string(18) "ポメラニアン"
        ["id"]=> int(2)
    }
    [2]=> array(4) {
        ["regist_datetime"]=> string(16) "2017-02-16 15:00"
        ["age"]=> int(8)
        ["name"]=> string(30) "ゴールデンレトリバー"
        ["id"]=> int(5)
    }
    [3]=> array(4) {
        ["regist_datetime"]=> string(16) "2017-02-16 16:30"
        ["age"]=> int(6)
        ["name"]=> string(21) "グレイハウンド"
        ["id"]=> int(6)
    }
    [4]=> array(4) {
        ["regist_datetime"]=> string(16) "2017-02-16 19:00"
        ["age"]=> int(3)
        ["name"]=> string(27) "シベリアンハスキー"
        ["id"]=> int(8)
    }
}

子要素の「id」「name」などの並びだけが逆になっていることが確認できました。