array_multisort で キー値を保持しつつソートする
ArrayベースのDBを作って、使ってるわけですが、
そういう稀有な場合、array_multisort君がキー値を捨ててしまうのが
非常に邪魔なので、それをなんとか保持できないかという方法。
//今回のテストデータ
$mainData = array();
$mainData[] = array('data'=>'green33','main'=>'red33');
$mainData[] = array('data'=>'green40','main'=>'red40');
$mainData[] = array('data'=>'green31','main'=>'red31');
$mainData[] = array('data'=>'green10','main'=>'red10');
$mainData[] = array('data'=>'green20','main'=>'red20');
$mainData[] = array('data'=>'green30','main'=>'red30');
普通にやるとこう
$search = array();
foreach ($mainData as $v) $search[] = $v['main'];
array_multisort($search,$mainData);
print_r($mainData);
Array
(
[0] => Array
(
[data] => green10
[main] => red10
)
[1] => Array
(
[data] => green20
[main] => red20
)
[2] => Array
(
[data] => green30
[main] => red30
)
-略-
)
で どうするかというと、
array_multisort君が捨てるキーは数値添字のみなので、
数値添字をstringに変えてしまう(型キャストだけだと、自動変換でINTに戻っちゃう)
ってことでこうする
//キーを取得してすべて文字列にして元の配列に戻す
$keyData = array_keys($mainData);
array_walk($keyData,create_function('&$i,$k','$i .= "_";'));
$keyFixedData = array_combine($keyData,$mainData);
//それをarray_multisort
$search = array();
foreach ($mainData as $v) $search[] = $v['main'];
array_multisort($search,$keyFixedData);
//またキーを全部取得して最初の添字に戻す
$keyData = array_keys($keyFixedData);
array_walk($keyData,create_function('&$i,$k','$t = split("_",$i);$i = $t[0];'));
$result = array_combine($keyData,$keyFixedData);
//中間データはこんな感じになる
print_r($keyFixedData);
Array
(
[3_] => Array
(
[data] => green10
[main] => red10
)
[4_] => Array
(
[data] => green20
[main] => red20
)
[5_] => Array
(
[data] => green30
[main] => red30
)
-略-
)
//完成データ
print_r($result);
Array
(
[3] => Array
(
[data] => green10
[main] => red10
)
[4] => Array
(
[data] => green20
[main] => red20
)
[5] => Array
(
[data] => green30
[main] => red30
)
-略-
)
ってなって最終的にキーを保持したarray_multisortが可能になるというわけです。
結論
arrayベースのDBはやめましょう