[PHP][HTML, CSS]画像を隙間なく並べて表示

高さの違う画像をタイル状に敷き詰めて表示させる場合、Javascript を利用することが多いですが、あえて PHP で表現すると次のようになります。

<?php
//カラム数(一段に並べる枚数)
$column = 3;
//幅
$width = 100;
//画像ディレクトリ
$dir = "images/";
$list = scandir($dir);

$files = array();
foreach($list as $value){
  if(is_file($dir . $value)){
    $files[] = $dir . $value;
  }
}

function columnGallery($files, $column, $width){

  $div = array();
  
  for($i=0;$i<$column;$i++){
    $heightTotal[$i] = 0;
  }
  
  foreach($files as $file){
    asort($heightTotal);
    $keys   = array_keys($heightTotal);
    $target   = reset($keys);
    $size   = getimagesize($file);
    $height   = $size[1];
    if(!isset($div[$target])) $div[$target] = array();
    $div[$target][] = $file;
    $heightTotal[$target] += $height;
  }
  
  foreach($div as $files){
    echo "<div class=\"column\">\n";
    foreach($files as $file){
      echo "<img src=\"{$file}\" style=\"width:{$width}px;\" /><br />\n";
    }
    echo "</div>\n";
  }
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Gallery</title>
<style type="text/css">
.column {float:left;}
</style>
</head>
<body>
<?php columnGallery($files, $column, $width);?>
</body>
</html>

サンプルではディレクトリ内のファイル全てを並べて表示しています。

画像の横幅を統一し、カラムとして横並びにすることでぴったり並んだように見せています。
応用すれば Pinterest のような表示もできると思います。

grid

カラムごとに画像の高さの合計値を計算し、一番短いカラムに画像を追加してバランスを取ります。

リキッドレイアウトでウィンドウサイズの変更に合わせて並び直しをしたい場合は素直に Javascript を使ったほうがいいと思います。

その場合は「jQuery Masonry」が便利です。
Masonry

[PHP]「キリ番」を判定する

「キリ番」と聞くとずいぶん懐かしい響きですが、要するに切りの良い数字のことです。
定義は色々あるのですが、概ね「10000」などの桁が上がった時か、「777」などの同じ数字の連続、「12345」などの連番がキリ番とみなされることが多いようです。

<?php
for($i=0;$i<=3000;$i++){
  //ゼロの連続
  $flag = false;
  if(preg_match("/^[1-9]0+$/", $i)){
    $flag = true;
  }
  
  //ゾロ目
  if(preg_match("/^([1-9])\\1{2,}$/", $i)){
    $flag = true;
  }
  
  //連番
  if( $i >= 100 && (string)$i === substr("123456789", 0, strlen($i))){
    $flag = true;
  }
  if($flag) echo $i . "<br>\n";
}

大体正規表現を使えば取得できます。連番も正規表現で取れなくはないのですが、直接比較したほうが直感的なのでこのようにしました。
12を連番とみなすにはやや無理があったので3桁以上あることを条件にしてあります。
同じ理由でゾロ目も3桁以上を条件にしてありますが、「11」や「22」も許可するなら少し数字を書き換えます。

/^([1-9])\\1{1,}$/

[PHP]一年分の日付を曜日付きで一覧表示

フォーム等で日にちを選択させる場合、手書きで日付一覧を書くのは大変です。
「2013/05/12(日)」のような形式で日付一覧を表示させる場合は date() 関数を使えばシンプルに書くことができます。

<?php
$y = 2013;
$wday=array("日","月","火","水","木","金","土");

for($m=1;$m<=12;$m++){
  $lastday = date("t", mktime(0,0,0,$m,1,$y));
  for($d=1;($d <= $lastday);$d++){
    $timestamp = mktime(0,0,0,$m,$d,$y);
    $w = $wday[date("w", $timestamp)];
    echo date("Y/m/d", $timestamp) . "({$w})<br />\n";
  }
}

出力結果

2013/01/01(火)
2013/01/02(水)
2013/01/03(木)
2013/01/04(金)
2013/01/05(土)
2013/01/06(日)
2013/01/07(月)
2013/01/08(火)
2013/01/09(水)
2013/01/10(木)
2013/01/11(金)
(以下省略)