Created
August 2, 2011 06:07
-
-
Save k-holy/1119672 to your computer and use it in GitHub Desktop.
数値選択用の配列を生成するサンプル
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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