この文字列値配列の例をどのように変換できますか:
$taba=array('12/04/12','13/05/13','03/01/12');
日付型の値に対して、選択オプションの HTML 入力で文字列として返す前に、これらの日付を時系列で並べ替えますか?
バリアントとして、strtotime()
必要に応じて並べ替えて出力前に変換するよりも、各要素をタイムスタンプに変換するために使用できます。例:
$taba=array('12/04/12','13/05/13','03/01/12'); usort($taba, function($a, $b){ $ta = strtotime(str_replace('/', '-', $a)); $tb = strtotime(str_replace('/', '-', $b)); if ($ta == $tb) { return 0; } return ($ta < $tb) ? -1 : 1; }); print_r($taba);
を使用array_map
して、各入力日付のタイムスタンプを取得しarray_multisort
、対応するタイムスタンプの並べ替え順序に基づいて日付を並べ替えることができます。
$taba=array('12/04/12','13/05/13','03/01/12');
$timestamps = array_map(function($d) {
return DateTime::createFromFormat('d/m/y', $d)->getTimestamp(); }, $taba);
array_multisort($timestamps, $taba);
print_r($taba);
$taba=array('12/04/12','13/05/13','03/01/12');
usort(
$taba,
function ($valueA, $valueB) {
return preg_replace('#(\d+)\/(\d+)\/(\d+)#', '$3$2$1', $valueA) >
preg_replace('#(\d+)\/(\d+)\/(\d+)#', '$3$2$1', $valueB);
}
);
var_dump($taba);
無効な日付について心配しておらず、すべての日付の形式が一貫している場合は、日付を並べ替えるカスタム比較関数でusortを使用することをお勧めします。
function cmp($a, $b) {
$year = strcmp(substr($a, -2), substr($b, -2));
if ($year == 0) {
// years are the same, try month
$month = strcmp(substr($a, 3, 2), substr($b, 3, 2));
if ($month == 0) {
return strcmp(substr($a, 0, 2), substr($b, 3, 2));
}
return $month;
}
return $year;
}
$taba=array('12/04/12','13/05/13','03/01/12');
function todate($date){
// as Legionar comment your date format is wrong .. can't guess which is date, which is year..
// if year is the last numbers you must change the return to ..
// return strtotime(implode("-",array_reverse(explode("/",$date))));
return strtotime(str_replace("/","-",$date));
}
$map = array_map('todate', $taba);
sort($map);
echo "<select>";
foreach($map as $key=>$value) {
echo '<option>'.date("Y-m-d H:i:s", $value)."</option>";
}
echo "</select>";
申し訳ありませんが、ソートポイントを逃しました。これは並べ替えです:) foreach日付関数で希望の日付形式を生成できます..