我正在构建一个日历,显示团队成员在一个月中的每一天都有多忙。
我有一个数组,里面有人:$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代码,但我真的不知道要更改什么才能使其工作。
为了使用array_push
,引用区域dy需要是一个数组。这只是意味着,你需要初始化它:
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) {
...
}