$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 = 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
についての記述がないし、ドキュメントの書き方も対になっているような記述じゃないし…