中級プログラマの自宅でPHP ブログ

自宅用ポータルシステム「MyHome Portal」をオープンソースで公開。MyHome Portalの説明とエンハンス情報。

PHP:多次元配列ソートと配列要素の削除

PHPには、便利な関数が豊富にあります。

Ver.2.47で、アルバムの画像の表示順序をファイル名順と更新日時順が選択できるようにしました。 また、表示順序がファイル名順の場合、Windowsエクスプローラと同じくアルファベットの大文字/小文字を区別しないで並び変えるようにしました。

これには、array_multisort()という関数を使っています。

ディレクトリで読み取ったファイル一覧を、セッション変数に、

$_SESSION['photo'] = array(

  'file'=>myfile_DECODE($file),

  'file_low'=>mb_strtolower(myfile_DECODE($file)),

  'type'=>'img',

  'time'=>filemtime($path_SJIS.'/'.$file));

のようにして配列で保管しておき、ファイル名順と更新日時順の切り替えで以下ようにして並び替えをしています。

if ($_SESSION['photo_view_sort'] == 'time') {

  $time = array();

  foreach ($_SESSION['photo'] as $photo) $time = $photo['time'];

  array_multisort($time, SORT_ASC, SORT_NUMERIC, $_SESSION['photo']);

} else {

  $file_low = array();

  foreach ($_SESSION['photo'] as $photo) $file_low[] = $photo['file_low'];

  array_multisort($file_low, SORT_ASC, SORT_STRING, $_SESSION['photo']);

}

Ver.2.47では、アルバムにファイル削除機能(___trash___フォルダへの移動)も追加しました。この場合、実際のファイル移動と共に上記配列から、該当ファイルの要素を削除する必要があります。これには、array_splice()を使います。

  array_splice($_SESSION['photo'], $page-1, 1);

unset()では駄目です。

例えば、$a[0]='A',$a[1]='B',$a[2]='C',$a[3]='D',$a[4]='E'みたいな配列があった場合、

unset($a[3])とすると、

  $a[0]='A',$a[1]='B',$a[2]='C',$a[4]='E'

と歯抜け状態になってしまいます。

array_splice($a,3,1)では、添え字もきちんと詰めてくれます。

  $a[0]='A',$a[1]='B',$a[2]='C',$a[3]='E'

foreachで処理する場合は、unset()でも問題ないのかも知れませんが、添え字で処理する場合は不都合です。

unset()で歯抜けになるのは、以下の記事で知りました。

http://xiaoxia.exblog.jp/7467902/