在果壳中
当我在排序之前调用数组上的 print_r()
或 var_dump()
时,为什么返回错误数组排序的函数会返回预期的顺序?
The Nitty Gritties
我正在尝试打印有关从几个Google日历收集的下几个事件的基本信息,根据事件开始日期/时间按自定义 uasort()
排序 .
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()
本身的输出,它没有排序) .
I Have Tried:
*如果它是一个变量范围问题,则在 getUpcomingEvents()
之上声明 global $events;
*使用 usort
而不是 uasort
,并使用单独的比较函数声明而不是匿名声明
*将 $events
构建为显式索引数组( $events[$i] = ...
),而不是使用 []
运算符,以防有助于维护更稳定的数组顺序
*将 getUpcomingEvents()
分配给新变量,然后再将其传递给 foreach
变量检查真的会影响我的排序还是我在其他地方出错了?
1 回答
不,print_r不会影响您的阵列 . 它只显示变量的信息 .
来自PHP page