【问题标题】:PHP - invalid argument: foreach - inside WordpressPHP - 无效参数:foreach - Wordpress 内
【发布时间】:2013-07-22 16:44:39
【问题描述】:

我遇到了一个我以前从未遇到过的 wordpress 网站问题。请允许我提供一些简短的细节...

背景: 我正在开发的网站是一个大学广播电台。该站设置了 9 个 2 小时的“表演时间”块,在各种学生表演之间分开。这些时间段从早上 8 点开始,到凌晨 2 点结束,间隔为 2 小时。所以上午 8 点到 10 点和上午 10 点到中午 12 点等......我们需要做的是显示“正在播放”的节目和“正在播放”之后的节目。

也就是说...我已经编写了以下代码,并且已确认可以在测试站点上运行...该站点是http://khill.mhostiuckproductions.com/siteNowplaying/ 该代码完全按照我的需要运行,没有任何错误。

现在,当我将其切换到 wordpress 时,我收到以下错误:警告:在 [目录到文件和行号] 中为 foreach() 提供的参数无效

我昨天在一位绅士的帮助下确定/知道的:

出现上述错误是因为foreach 中的数组$showBlocks 为空。我通过在 var 转储输出 NULL 的 wordpress 站点上的该数组上执行 var_dump 来知道这一点。这与我的变量是全局变量有关(根据我的理解,全局变量可能会变得令人讨厌,这是有道理的)。

这位先生提供了一个可能的解决方案,但在我不得不将其退出之前,我无法完全工作,我将在下面讨论该建议的解决方案...


代码:

现在我意识到这段代码很糟糕,我需要使用类,最终是一个数据库,我的代码现在看起来像这样,因为我没有大量的 PHP 或 SQL 经验,而且我的截止日期很快接近。我需要解决这个问题并开始工作,这样我才能继续前进并完成网站的其余部分。我计划在新主题发布后在后台进一步开发它,最终它将作为插件/小部件与 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,
);

第一个函数...这只是检查今天是哪一天,并且 echo 是当天的适当函数,这是我将向您展示的下一段代码。我在我希望输出出现的站点中回显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 chat 中的某个人指导我的那样,是因为当我将此代码放入 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()。为了使代码显示实际的下一个节目,我将 7200(2 小时内的秒数)添加到 time() 所以...time + 7200。这个添加在上面代码的 if 语句中......所以它现在看起来像这样......

if (time() + 7200 > strtotime($range[0]) && strtotime($range[1]) > time() + 7200) {

聊天中给我的建议但我无法开始工作:

在聊天中,有人建议我摆脱全局变量,并通过单独的文件将我的数组直接包含到函数中...我尝试通过将上面的 $showBlocks 数组移动到单独的文件“现在-播放-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]); 
        }
    }
}

$showBlocks 上的 var_dump 现在生成:bool(false)


现在问题...

请记住,这段代码是非常暴力的,我知道并意识到这一点,但这就是我现在想要的。我将使用这个项目来扩展我的 PHP 以使用类和数据库等,但我现在没有时间。我不是在寻找,你的代码很糟糕,你应该重新开始并以正确的方式回答......我已经知道了。

首先,如果您了解这位聊天中的先生试图带我走的路线,那是最好的路线吗?

如果这是最好的路线,我该如何完成它?从我收集到的 bool(false) 东西意味着它找不到我的文件?这些文件都在同一个文件夹中。

【问题讨论】:

  • 为了写作的彻底性不得不 +1...
  • @Ben 哈哈,谢谢。我需要快速解决这个问题,作为回答人们问题的用户,最困扰我的一件事是缺乏适当细节的问题。

标签: php wordpress


【解决方案1】:

您可以将返回数组放入函数中,然后简单地调用该函数并将其分配给 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();

这样,您无需显式全球化任何内容,也无需担心有多余的文件。只需为每个节目列表数组创建一个函数,然后让它返回。

一件小事:在上面的代码中,我将 $mondayShows 数组值更改为已定义的值(只是字母),因此请确保您实际上将这些值分配给了某个值。

【讨论】:

  • 哈,这太棒了。不敢相信我自己没有想到,完全有道理。我会实现这个,看看它是否有效,然后回来告诉你。
  • 有趣的是,测试站点工作得很好,我现在在 Wordpress 站点上不再收到错误,但我没有得到任何输出。
  • 只是为了确保已定义显示变量,对吗?另外,你把代码放在wordpress的什么地方?
  • 它们被定义了,我遇到了一个问题,我必须然后全球化该数组中列出的变量......我只是将变量的输出直接复制到大批。 (我这样做只是为了让我的一个要维护该站点的朋友不会弄乱使这一切正常工作的 php 文件)我在第一个 标记之后包含了包含我所有代码的文件.然后我在模板的相应区域中有一个调用 nowPlaying() 函数的回声。
  • 导致我的脚本停止工作的问题是 $day 变量。由于某种原因它停止工作,我仍然不确定为什么,但我通过将它移动到 nowPlaying() 和 playNext() 函数中来修复它。现在就像一个魅力!感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多