[php]foreach下での多次元連想配列の作り方

つかれたぴょん

何がしたいかって話

  • /images/01/
  • /images/02/
  • /images/03/

みたいな感じでディレクトリが別れてて、

  • /images/01/01.jpg
  • /images/01/02.jpg
  • /images/01/03.jpg
  • /images/01/04.jpg

みたいな感じで画像をそれぞれに突っ込んである。
ディレクトリ毎に分けたスライダーをページ上に並べたい。
後のことを考えたら都度手打ちするのはめんどくさいから、画像を足したら勝手に反映するようにしたい。そのためにはデータベース的なものがないと始まらない。

ということで、多次元連想配列に収められたら何とかなるよなっていう安易な目論見。
多次元連想配列を作る。

配列の完成イメージ

まあ、こんな感じでディレクトリ名をキーにしてファイル名を並べたかったわけです。

$imageArray = [
	'01' => array('01.jpg','02.jpg','03.jpg','04.jpg'),
	'02' => array('01.jpg','02.jpg','03.jpg','04.jpg','05.jpg','06.jpg'),
	'03' => array('01.jpg','02.jpg','03.jpg','04.jpg','05.jpg','06.jpg'),
	'04' => array('01.jpg','02.jpg','03.jpg','04.jpg','05.jpg')
];

こうやって作る

専門分野じゃないのでとりあえず処理の速さは抜きにして、完成したので今回は良しとする。

$imagesArray = array();
$dir = "./images/";
$res = scandir($dir);
unset($res[0],$res[1]);
$dirArray = array_values($res); 
foreach($dirArray as $dirName){
	$fileName = scandir($dir.$dirName);
	unset($fileName[0],$fileName[1]);
	$fileNameArray = array_values($fileName);
	$imagesArray += array($dirName => $fileNameArray);
}

var_dump($imagesArray);

前提

  • phpは「images」と同一ディレクトリに設置する
  • 「$imagesArray」に配列を格納する

仕組み

  1. 「images」内のディレクトリを配列で出す。
  2. ディレクトリ毎に入ってる画像名(拡張子込み)を配列で出す。
  3. 2つの配列を組み合わせて多次元連想配列を生成する。

scandir()

今回の肝の部分。
指定したディレクトリ内のファイルやらディレクトリを配列で出してくれる。
images直下にはディレクトリしか設置しない、その下には使う画像ファイルのみ設置するってルールを作ってるので選り分けるフィルター的なものは今回組んでない。scandir()の最初の2つは必ず「.」と「..」になってて、要らないからunset()で削除して、array_values()で整える。

多次元連想配列の生成について

「$imagesArray = array();」で配列用の変数だって宣言しておく。
「$imagesArray += array($dirName => $fileNameArray);」でforeachを回して配列に追加していく。
「$imagesArray += [$dirName => $fileNameArray];」でもいい。

「$imagesArray[] = array($dirName => $fileNameArray);」は間違い。
やってみたらわかるけどこれは意味が違う。

「$imagesArray += [$dir.$dirName.’/’ => $fileNameArray];」にすれば「./images/01/」って感じに階層付きにできるから用途によっては良いかもね。

コメント

タイトルとURLをコピーしました