Skip to content

Instantly share code, notes, and snippets.

@k-holy
Created August 2, 2011 06:07
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save k-holy/1119672 to your computer and use it in GitHub Desktop.
Save k-holy/1119672 to your computer and use it in GitHub Desktop.
数値選択用の配列を生成するサンプル
<?php
namespace Holy;
// キーにzero-paddingした半角数字、テキストに全角数字を持つ日付選択用の配列を生成する
class Util {
public static function H($data) {
if (isset($data) && strlen($data) >= 1) {
$data = htmlspecialchars($data, ENT_QUOTES, 'UTF-8');
}
return $data;
}
public static function number_options($start, $limit, $step=1)
{
$options = array();
for ($i = $start; ($step > 0 && $i <= $limit) || ($step < 0 && $i >= $limit); $i += $step) {
$options[sprintf('%02d', $i)] = mb_convert_kana($i , 'N', 'UTF-8');
}
return $options;
}
}
use Holy\Util as U;
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>test</title>
</head>
<body>
<p>キーにzero-paddingした半角数字、テキストに全角数字を持つ日付選択用の配列を生成する</p>
<form>
<h2>U::number_options(1, 31, 1)</h2>
<?php
$options = U::number_options(1, 31, 1);
?>
<select name="day_1">
<?php foreach ($options as $value => $text) : ?>
<option value="<?=U::H($value)?>"
<?=(isset($_GET['day_1']) && $_GET['day_1'] === $value) ? ' selected="selected"' : ''?>
><?=U::H($text)?></option>
<?php endforeach ?>
</select>
<hr />
<h2>range() + array_map() + array_combine()</h2>
<?php
$options = array_combine(
array_map(function($value) {
return sprintf('%02d', $value);
}, range(1, 31, 1)),
array_map(function($value) {
return mb_convert_kana($value, 'N', 'UTF-8');
}, range(1, 31, 1)));
?>
<select name="day_2">
<?php foreach ($options as $value => $text) : ?>
<option value="<?=U::H($value)?>"
<?=(isset($_GET['day_2']) && $_GET['day_2'] === $value) ? ' selected="selected"' : ''?>
><?=U::H($text)?></option>
<?php endforeach ?>
</select>
<hr />
<h2>key, valueを逆にしてみる</h2>
<?php
$options = array_combine(
array_map(function($value) {
return mb_convert_kana($value, 'N', 'UTF-8');
}, range(1, 31, 1)),
array_map(function($value) {
return sprintf('%02d', $value);
}, range(1, 31, 1)));
?>
<select name="day_3">
<?php foreach ($options as $value => $text) : ?>
<option value="<?=U::H($value)?>"
<?=(isset($_GET['day_3']) && $_GET['day_3'] === $value) ? ' selected="selected"' : ''?>
><?=U::H($text)?></option>
<?php endforeach ?>
</select>
<hr />
<h2>key, value逆からarray_flip()</h2>
<?php
$options = array_flip($options);
?>
<select name="day_4">
<?php foreach ($options as $value => $text) : ?>
<option value="<?=U::H($value)?>"
<?=(isset($_GET['day_4']) && $_GET['day_4'] === $value) ? ' selected="selected"' : ''?>
><?=U::H($text)?></option>
<?php endforeach ?>
</select>
<hr />
<input type="submit" value="送信" />
</form>
<pre>
<?php var_dump(array_keys($options)) ?>
</pre>
<hr />
<p>どうやら数字キーは強引にintに変換されてしまうらしい…</p>
<?php
// 直接定義
$array1 = array(
'01' => '1',
'02' => '2',
'03' => '3',
'04' => '4',
'05' => '5',
'06' => '6',
'07' => '7',
'08' => '8',
'09' => '9',
'10' => '10',
);
$array2 = array(
'11' => '11',
'12' => '12',
'13' => '13',
'14' => '14',
'15' => '15',
'16' => '16',
'17' => '17',
'18' => '18',
'19' => '19',
'20' => '20',
);
?>
<pre>
$array1 =
<?php var_dump($array1) ?>
array_keys($array1) =
<?php var_dump(array_keys($array1)) ?>
$array2 =
<?php var_dump($array2) ?>
array_keys($array2) =
<?php var_dump(array_keys($array2)) ?>
</pre>
<hr />
<p>数値なので、array_merge()すれば当然番号が0から振り直されてしまう</p>
<pre>
array_merge($array1, $array2) =
<?php var_dump(array_merge($array1, $array2)) ?>
</pre>
<p>配列演算子(+)の場合は左辺優先で結合される</p>
<pre>
$array1 + $array2 =
<?php var_dump($array1 + $array2) ?>
</pre>
<p>今回の例に限れば、後から渡された引数の値で上書きされる array_replace()も同様の結果となる</p>
<pre>
array_replace($array1, $array2) =
<?php var_dump(array_replace($array1, $array2)) ?>
</pre>
</body>
</html>
<?php
// range()だけでやっちゃうとstringではなくintになるのでこう書く (PHP5.3)
$start = 2000;
$limit = intval(date('Y')) + 3;
$step = 1;
$years = array_map(function($value) {
return sprintf('%d', $value);
}, range($start, $limit, $step));
// range第3引数のstepは負の値でもOKっぽい? (マニュアルには正の値でないとダメってあるけど…)
$start = intval(date('Y')) + 3;
$limit = 2000;
$step = -1;
$years = array_map(function($value) {
return sprintf('%d', $value);
}, range($start, $limit, $step));
// stepがlimitと合わない場合はlimit以下の最も近い値になる (この例だと1998)
$start = 1990;
$limit = 1999;
$step = 2;
$years = array_map(function($value) {
return sprintf('%d', $value);
}, range($start, $limit, $step));
// いわゆるOptions形式の配列が欲しい場合はこんな感じ?
function createNumberOptions($start, $limit, $step=1, $valueFormat='%d', $textFormat='%d')
{
$options = array();
for ($i = $start; ($step > 0 && $i <= $limit) || ($step < 0 && $i >= $limit); $i += $step) {
$options[sprintf($valueFormat, $i)] = sprintf($textFormat , $i);
}
return $options;
}
$options = createNumberOptions(1, 31, 1, '%02d', '%d');
// 標準関数でも一行で書けるけど微妙
$options = array_combine(
array_map(function($value) {
return sprintf('%02d', $value);
}, range(1, 31)),
array_map(function($value) {
return sprintf('%d', $value);
}, range(1, 31)));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment