【问题标题】:Why does variable inspection seem to correct my sorting?为什么变量检查似乎可以纠正我的排序?
【发布时间】:2013-02-13 09:09:23
【问题描述】:

简而言之

当我在排序前对数组调用print_r()var_dump() 时,为什么返回错误数组排序的函数会返回预期的排序?

细枝末节

我正在尝试打印从几个 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,...
(注意:这些是打印出来的&lt;li&gt;'s,不是print_r()本身的输出,没有排序)。

我试过了:
* 在getUpcomingEvents() 上方声明global $events;,以防这是一个变量范围问题
* 使用usort 代替uasort,并使用单独的比较函数声明代替匿名函数
* 将 $events 构建为显式索引数组 ($events[$i] = ...),而不是使用 [] 运算符,以防有助于保持更稳定的数组顺序
* 将getUpcomingEvents() 分配给一个新变量,然后再将其传递给foreach

变量检查真的会影响我的排序还是我在其他地方出错了?

【问题讨论】:

    标签: php sorting


    【解决方案1】:

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

    来自PHP page

    print_r — Prints human-readable information about a variable
    

    【讨论】:

    • 谢谢,我已经参考了 PHP 文档,但该文档并不一定排除修改作为副作用的可能性,是吗?我应该强调我不认为我的变量被修改可能,但它确实看起来像基于我描述的行为。我更新了问题标题,以便更好地关注问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 2013-06-28
    相关资源
    最近更新 更多