我遇到了以前没有遇到的wordpress网站的问题。请允许我提供一些快速细节......
背景 我正在工作的网站是大学广播电台。该站设置了9个2小时的"显示时间"这是在各种学生节目之间分开的。这些时间段从上午8点开始,到凌晨2点结束,间隔为2小时。所以早上8点到10点和10点到12点正午等......我们需要做的是展示现在正在播放的节目"和#34;播放下一个"。
之后的节目那就是说...我已经编写了下面的代码,并确认在测试网站上工作......该网站是http://khill.mhostiuckproductions.com/siteNowplaying/代码完全按照我的需要运行,没有任何错误。
现在,当我将其切换到wordpress时,我收到以下错误:警告:在[目录到文件和行#]中为foreach()提供的参数无效
我昨天在一位绅士的帮助下确定/知道的事情:
发生上述错误是因为$showBlocks
中的数组foreach
为空。我知道这一点,在wordpress网站上对该数组执行var_dump
,其中var dump输出 NULL 。这与我的变量是全局变量有关(全局变量可能会从我理解的变量中变得令人讨厌)。
绅士提供了一个可能的解决方案,在我不得不称之为退出之前我无法完全工作,我将在下面讨论提出的解决方案......
代码:
现在我意识到这段代码非常糟糕,我需要使用类,最后是数据库,我的代码现在看起来像这样,因为我没有大量的PHP或SQL经验,而且我有一个截止日期&# 39;快速接近。我需要把它打倒并工作,这样我就可以继续完成网站的其余部分。我计划在新主题推出后在后台进一步开发,最终它将作为插件/小部件与wordpress CMS结合。
那就是说......我意识到我正在做的事情是非常蛮力的,我可以用粗暴的强制解决方案。正如我上面所说的那样,我的代码在一个独立的测试站点上运行得非常完美,只有当它被移动到wordpress中时才会中断。
我简化了我的代码,只提供了一天所需的内容(一周中每天都有很多重复的内容,当你继续往下走时,你会理解这些内容)。
我的文件顶部有以下变量......
$day = date(D); // Textual representation of day in the format of "Mon, Tue, Wed" etc.
date_default_timezone_set('America/New_York'); // Set the default time zone (EST)
我有以下数组...第一个建立我的"块"根据他们的开始和结束时间的时间,第二个带来存储我的"输出"的变量。这些输出位于一个单独的文件中,该文件包含在包含我在此处显示的所有代码的文件上方。第二个数组在一周中的每一天被提供,变量名称也相应地改变。
// $showBlocks Array
$showBlocks = array ( // Define available blocks of show time | starts at 8AM ends at 2AM with 2 hour increments
'a' => array ('00:00:01', '02:00:00'), // MIDNIGHT TO 2AM
'b' => array ('02:00:00', '08:00:00'), // OFF AIR TIME
'c' => array ('08:00:00', '10:00:00'),
'd' => array ('10:00:00', '12:00:00'),
'e' => array ('12:00:00', '14:00:00'), // NOON to 2PM
'f' => array ('14:00:00', '16:00:00'),
'g' => array ('16:00:00', '18:00:00'),
'h' => array ('18:00:00', '20:00:00'),
'i' => array ('20:00:00', '22:00:00'),
'j' => array ('22:00:00', '23:59:59'),
);
$mondayShows = array (
'a' => $sunday12a_2a, // MIDNIGHT TO 2AM
'b' => $offAirTime, // OFF AIR TIME
'c' => $monday8a_10a,
'd' => $monday10a_12,
'e' => $mondayy12_2, // NOON to 2PM
'f' => $monday2_4,
'g' => $monday4_6,
'h' => $monday6_8,
'i' => $monday8_10,
'j' => $monday10_12a,
);
第一个功能......这只是检查它是什么日子,并回显当天的相应功能,这是我向您展示的下一段代码。我回复了我希望输出显示的网站中的nowPlaying()
函数。
function nowPlaying() {
global $day;
if ($day == "Sun") { //IF DAY IS TRUE THEN PERFORM AN ACTION
echo sundayShow();
} else if ($day == "Mon") {
echo mondayShow();
} else if ($day == "Tue") {
echo tuesdayShow();
} else if ($day == "Wed") {
echo wednesdayShow();
} else if ($day == "Thu") {
echo thursdayShow();
} else if ($day == "Fri") {
echo fridayShow();
} else if ($day == "Sat") {
echo saturdayShow();
}
}
为了简单起见,我将只向您展示上述功能中出现的一个功能,我们将在周一使用星期一。
此函数使用上面看到的两个数组作为输入,$mondayShows
数组变量更改为$tuesdayShows
函数的tuesdayShow()
。 (基本上完全相同的代码,数组输入的变量名称不同)这里的foreach是错误代码表示存在问题的行。再次,正如来自php聊天的人引导我,是因为当我将此代码放入wordpress时,突然我的数组变空了。
function mondayShow() {
global $mondayShows, $showBlocks; // GLOBALIZE THESE VARIABLES
foreach ($showBlocks as $name => $range) {
if (time() > strtotime($range[0]) && strtotime($range[1]) > time()) { // checks if time() is between defined ranges from $showBlocks array
echo($mondayShows[$name]);
}
}
}
早些时候我提到过显示什么是"播放下一个"。这是通过使用新名称复制所有上述代码来处理的,例如,上述函数的等效代码的名称变为mondayNextShow()
。为了使代码显示实际的下一个节目,我将{72}(2小时内的秒数)添加到time()
所以...... time + 7200
。这个添加在上面代码的if语句中...所以它现在看起来像这样......
if (time() + 7200 > strtotime($range[0]) && strtotime($range[1]) > time() + 7200) {
在聊天中向我建议但我无法开始工作:
在聊天中,有人建议我摆脱全局变量,并通过一个单独的文件直接将我的数组包含到函数中......我试过将上面的$showBlocks
数组移到一个单独的文件中#34;现在扮演-array.php"例如。数组代码已从上面更改为return
array
,所以它现在看起来像这样:
return array (
'a' => array ('00:00:01', '02:00:00'), // 12AM MIDNIGHT TO 2AM
'b' => array ('02:00:00', '08:00:00'), // OFF AIR TIME
'c' => array ('08:00:00', '10:00:00'),
....................
);
然后我从上述函数的全局变量中删除$ showBlocks,并使用__DIR__
魔术常量将所述文件包含到函数中。
上面的功能现在看起来像这样:
function mondayShow() {
global $mondayShows; // GLOBALIZE THESE VARIABLES
$showBlocks = include __DIR__."/now-playing-arrays.php";
foreach ($showBlocks as $name => $range) {
if (time() > strtotime($range[0]) && strtotime($range[1]) > time()) { // checks if time() is between defined ranges from $showBlocks array
echo($mondayShows[$name]);
}
}
}
var_dump
上的$showBlocks
现已生成:bool(false)
请记住,这段代码是非常暴力的,我知道并意识到这一点,但这就是我现在想要的。我将使用这个项目将我的PHP扩展为使用类和数据库等,但我现在没有时间。我不是在寻找,你的代码很糟糕你应该重新开始并以正确的方式做出答案......我已经知道了。
首先,如果你了解这位来自聊天的绅士试图带我走的路线,这是最好的路线吗?
如果这是最佳路线,我该如何完成它?从我收集的bool(false)事情意味着它无法找到我的文件?这些文件都在同一个文件夹中。
答案 0 :(得分:2)
您可以将返回数组放入函数中,然后只需调用该函数并将其分配给mondayShow()
函数中的变量:
function showBlocks(){
return array (
'a' => array ('00:00:01', '02:00:00'), // MIDNIGHT TO 2AM
'b' => array ('02:00:00', '08:00:00'), // OFF AIR TIME
'c' => array ('08:00:00', '10:00:00'),
'd' => array ('10:00:00', '12:00:00'),
'e' => array ('12:00:00', '14:00:00'), // NOON to 2PM
'f' => array ('14:00:00', '16:00:00'),
'g' => array ('16:00:00', '18:00:00'),
'h' => array ('18:00:00', '20:00:00'),
'i' => array ('20:00:00', '22:00:00'),
'j' => array ('22:00:00', '23:59:59'),
);
}
function mondayShows(){
return array (
'a' => "a", // MIDNIGHT TO 2AM
'b' => "b", // OFF AIR TIME
'c' => "c",
'd' => "d",
'e' => "e", // NOON to 2PM
'f' => "f",
'g' => "g",
'h' => "h",
'i' => "i",
'j' => "j",
);
}
function mondayShow() {
$showBlocks = showBlocks();
$mondayShows = mondayShows();
foreach ($showBlocks as $name => $range) {
if (time() > strtotime($range[0]) && strtotime($range[1]) > time()) {
echo($mondayShows[$name]);
}
}
}
mondayShow();
这样,您不需要显式地全局化任何内容,也不必担心有额外的文件。只需为每个show list数组创建一个函数,然后让它返回。
一件小事:在上面的代码中,我将$mondayShows
数组值更改为已定义的内容(只是字母),因此请确保您实际将这些值分配给某些内容。