LoginSignup
5
9

More than 5 years have passed since last update.

配列の並び替え

Posted at
配列の並び替え
$array = array(
    'a' => 1,
    'b' => 2,
    'c' => 3,
    'd' => 4,
);

foreach ($array as $key => $value) {
    echo "$key : $value \n";
}

echo "\n";

$sort = array_fill_keys(array('b', 'd', 'a', 'c'), null);

$array = array_merge($sort, $array);

foreach ($array as $key => $value) {
    echo "$key : $value \n";
}
結果

a : 1
b : 2
c : 3
d : 4

b : 2
d : 4
a : 1
c : 3


配列をforeachで回してテーブル作成などをよくします。
しかしデータベースのカラム順が良くなかったり、SELECT順を操作出来なかったり、後から表示順を入れ替えてほしいと言われたりすることがある。
表示順のキー配列を別途用意しforeachして出力することもできるが、出力対象自体を繰り返してないので違和感があるし、viewに余計な変数も渡したくはない。
そこで配列を直接並び替えようと思ったが、それらしい関数も記事も出てこず、昇順・降順の並び替えばかり引っかかってしまう。

普通に代入やforeachでも出来ると思うが、'' => ,を書いたり縦にスペースが取られるのが嫌だし、foreachも簡単なものでも読むのが結構しんどいので楽にしたかった。

ただし、array_mergeは数値添字に使うと振り直しが起きるので文字列の連想配列にしか使用できない。

もっと楽にできるならしたい。

追記

それ、array_replaceで出来るよ

array_mergeを上書きすることで並べ替えが出来ると言う意図で使っていたが、数値添字が振り直される問題があった。最初の配列の値を後の配列の値で置き換えるのならばarray_replaceがある。
これならば数値添字にも対応できる。
array_replace

問題のある並び替え
$array = array(
    'a' => 1,
    'b' => 2,
    'c' => 3,
    'd' => 4,
    1   => 100,
);

foreach ($array as $key => $value) {
    echo "$key : $value \n";
}

echo "\n";

$sort = array_fill_keys(array(1, 'b', 'd', 'a', 'c'), null);

$array = array_merge($sort, $array);

foreach ($array as $key => $value) {
    echo "$key : $value \n";
}
結果

a : 1
b : 2
c : 3
d : 4
1 : 100

0 :
b : 2
d : 4
a : 1
c : 3
1 : 100

array_mergeでは同じ数値添字は追加のうえ値の振り直しが起きる。

array_replaceならば数値添字もそのまま。

array_replace
$array = array(
    'a' => 1,
    'b' => 2,
    'c' => 3,
    'd' => 4,
    1   => 100,
);

foreach ($array as $key => $value) {
    echo "$key : $value \n";
}

echo "\n";

$sort = array_fill_keys(array(1, 'b', 'd', 'a', 'c'), null);

$array = array_replace($sort, $array);

foreach ($array as $key => $value) {
    echo "$key : $value \n";
}

結果

a : 1
b : 2
c : 3
d : 4
1 : 100

1 : 100
b : 2
d : 4
a : 1
c : 3

今回は他の記事でarray_replaceが出ていて気になったから気づけたが、「array_mergeで出来たから振り直しは許容しよう」と思っていたので自戒の意でarray_mergeは残す。またarray_mergeでやりそうだし。

しかし、array_replaceはこの数値添字の動作を変えただけのarray_mergeなのだろうか。手元の書籍にはarray_replaceについての記述がないし、ドキュメントの書き方も対になっているような記述じゃないし…

5
9
0

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
5
9