【问题标题】:Nested arrays 'disappearing' in PHP/EECMSPHP/EECMS 中的嵌套数组“消失”
【发布时间】:2012-08-02 14:18:33
【问题描述】:

我正在构建一个日历,显示团队成员每个月每天的忙碌程度。

我有一个包含人的数组:$teammates。

每个队友都是另一个数组,包含名称和另一个数组,其中包含可用日期(周一 - 周日):

{exp:channel:entries channel="teammates"}
$teammate = array();
$available_days = array();

{available_days} // this is a PT-checkbox field, it loops through a list of selected checkboxes (mon, tue, wed, etc).
array_push($available_days, "{option_name}");
{/available_days}

$teammate["name"] = "{title}";
$teammate["available_days"] = $available_days;
$teammate["workdays"] = array();

array_push($teammates, $teammate);
{/exp:channel:entries}

现在每个月看起来都不一样。例如,8 月 1 日是星期三,而 9 月 1 日是星期六。这就是为什么我还需要构建一个当前月份的数组,其中包含日期名称和日期数字对:[["day_name" => "wed", "day_number" => 1], ["day_name" => "thu", "day_number" => 2], ... etc]

这是通过使用{exp:channel:calendar} 标签来完成的。细节不相关。我最终得到了一个名为 $days_array_full 的数组。

下一步是将当月的天数与每个队友的可用天数相结合,因此我最终在每个 $teammate 中得到一个数组,其中包含该人在场的确切天数,我称之为“工作日”。我这样做如下:

foreach($teammates as $teammate) {

    foreach($teammate["available_days"] as $available_day) {
        foreach($days_array_full as $day) {
            if($day["name"] == $available_day) {
                array_push($teammate["workdays"], array("name" => $day["name"], "number" => $day["number"]));
            }
        }

    }

    echo(count($teammate["workdays"]));
    // this echoes correct counts, such as about 25 for people who work 5 d/w.
}

但是,如果我稍后尝试访问队友$teammate["workdays"],则数组为空:

foreach($teammates as $teammate) {
    echo(count($teammate["workdays"]));
    // this always gives 0 for any teammate..., why?
}

我猜这是某种范围问题,因为 ExpressionEngine 在 eval() 中执行 PHP 代码,但我真的不知道要更改什么才能使其正常工作。

【问题讨论】:

  • 我能否谦虚地建议您将自定义操作移至插件,从而避免 PHP-in-template 问题?
  • 事实上,这根本不是一个坏主意。我应该开始使用插件而不是把 PHP 放在模板中。

标签: php arrays scope expressionengine


【解决方案1】:

为了使用array_push,引用区域需要是一个数组。这只是意味着,您需要对其进行初始化:

foreach($teammates as $key => $teammate) {
    $teammate["workdays"] = array();
    ...
}

更多信息:您可以使用以下注释,而不是使用array_push:

$teammate["workdays"][] = array("name" => $day["name"], "number" => $day["number"]);

最后需要将新创建的数组写回$teammates:

foreach($teammates as $key => $teammate) {
    ...
    $teammates[$key] = $teammate;
}

但更好的是,您只需使用 $teammate 作为参考,如下所示:

foreach($teammates as &$teammate) {
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 2022-01-18
    • 1970-01-01
    • 2017-04-03
    • 2021-08-05
    • 2013-06-17
    • 1970-01-01
    相关资源
    最近更新 更多