レコード…連想配列の配列…は、MDB::fetchAll() や DB::getAll() の結果の書式で見られるように一般的なデータ構造書式です。
たまにはコードを上げてみよう、ということで汎用関数としてレコードソート関数を作ってみました。実装コードおよびサンプルは下のほうにあります。
特に著作権等は主張しませんのでご自由にお使いください。
書式:
int sort_records(&$records, $key, $descent = false);
実装コード:
/**
* DBなどのレコードを任意のキーでソートする。
* PHP 4.4.9, PHP 5.2.8 で動作確認。
*
* @author ecoop.net
* @access public
* @param array &$records DBなどレコードの配列
* @param string $key ソートの基準にするカラムの名前。省略時は第一カラムでソート。
* @param boolean $descent true なら降順で結果を返す。省略時は false
* @return bool 成功なら true を返す
*/
function sort_records(&$records, $key = null, $descent = false){
if(!$records || !is_array($records)){ return false; }
// $key が省略された場合は第一レコードの第一カラムを名前を取得
if(is_null($key)){
$t = array_values($records);
$t = array_keys($t[0]);
if(!$t){ return false; }
$key = $t[0];
}
// —-
$map = array();
foreach($records as $i => $v){
if(!is_array($v) || !isset($v[$key])){ return false; }
$map[$v[$key] .’_’. $i] = $v;
}
if($descent){
$res = krsort($map);
}else{
$res = ksort($map);
}
$records = array_values($map);
return $res;
}
利用例:
// 元データ
$records = array(
array(‘age’ => 24, ‘name’=>’john’),
array(‘age’ => 33, ‘name’=>’george’),
array(‘age’ => 56, ‘name’=>’bill’),
array(‘age’ => 50, ‘name’=>’steven’),
);
// name カラムでソート
sort_records($records, ‘name’);
print_r($records);
結果:
Array
(
[0] => Array
(
[age] => 56
[name] => bill
)
[1] => Array
(
[age] => 33
[name] => george
)
[2] => Array
(
[age] => 24
[name] => john
)
[3] => Array
(
[age] => 50
[name] => steven
)
)