手短に
正しくない配列の順序を返す関数が、並べ替えの直前にprint_r()
または配列を呼び出したときに、期待される順序を返すのはなぜですか?var_dump()
ニッティ・グリッティーズ
uasort()
複数の Google カレンダーから収集された次のいくつかのイベントに関する基本情報を、イベントの開始日時に基づいてカスタムで並べ替えて印刷しようとしています。
function getUpcomingEvents()
{
$calUrls = array( /* Four Google calendar URLs */);
foreach ($calUrls as $url)
{
$calEvents = json_decode(file_get_contents($url), true);
for($i=0; $i<count($calEvents['items']); $i++)
{
$item = $calEvents['items'][$i];
$events[] = array(
'title' => $item['summary'],
'description' => $item['description'],
'start' => date_create($item['start']['dateTime']),
'end' => date_create($item['end']['dateTime']),
'htmlLink' => $item['htmlLink']
);
}
}
//print_r($events); // <-- **LOOK AT ME**
uasort($events, function($a, $b) {
return strtotime($a['start']->date) - strtotime($b['start']->date);
});
return $events;
}
...*snip*...
<?php foreach(getUpcomingEvents() as $event) : ?>
<li><h3><?php echo date_format($event['start'], 'M j'); ?></li>
<?php endforeach; ?>
このように print_r() をコメントアウトしてページをロードすると、リスト項目が次の順序で出力されます。
Feb 19, Feb 21, Feb 23, Feb 26, Mar 5, Feb 19, Feb 16,...
(注: これらはそれぞれカレンダー 1、2、1、1、1、2、2、... のイベントを表すため、単にカレンダー リクエストの順序を反映しているわけではありません。)
(他に変更を加えずに) のコメントを外した後print_r()
、リスト項目は時系列順に印刷されます。
Feb 10, Feb 14, Feb 16, Feb 16, Feb 16, Feb 19, Feb 19,...
(注: これらは印刷されたものであり、ソートされていないそれ自体<li>'s
の出力ではありません)。print_r()
私は試してみました: *変数のスコープの問題である場合に上記を
宣言する*の代わりに を
使用し、匿名のものの代わりに別の比較関数宣言を使用する*演算子を使用する代わりに、明示的にインデックス付けされた配列 ( )として
構築するより安定した配列順序を維持するのに役立ちます
*新しい変数に代入してからglobal $events;
getUpcomingEvents()
usort
uasort
$events
$events[$i] = ...
[]
getUpcomingEvents()
foreach
変数の検査は本当に私のソートに影響を与えていますか、それともどこかで間違っていますか?