为什么变量检查似乎纠正了我的排序?

时间:2013-02-13 09:09:23

标签: php sorting

在果壳中

为什么返回错误数组排序的函数会在排序之前调用数组上的print_r()var_dump()时返回预期的顺序?

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()本身的输出,它没有排序)。

我试过了:
*如果它是变量范围问题,则声明global $events;高于getUpcomingEvents() *使用usort代替uasort,使用单独的比较函数声明而不是匿名的声明 *将$events构建为显式索引数组($events[$i] = ...),而不是使用[]运算符,以防有助于维护更稳定的数组顺序
*在将新变量传递到getUpcomingEvents()

之前,将foreach分配给新变量

变量检查是否真的影响了我的排序,或者我在其他地方出错了?

1 个答案:

答案 0 :(得分:2)

不,print_r不会影响您的阵列。它只显示变量的信息。

来自PHP page

print_r — Prints human-readable information about a variable