警告:array_push()期望参数1为数组

11

这是我的代码,当我运行这个函数时,我会得到这个错误:Warning: array_push() expects parameter 1 to be array 然而在开始之前,我已经定义了$printed作为一个数组。

$printed = array();

function dayAdvance ($startDay, $endDay, $weekType){
         $newdateform = array(
                    'title' => date("M d", strtotime($startDay))."     to     ".date("M d", strtotime($endDay)). $type,
                    'start' => $startDay."T08:00:00Z",
                    'end' => $startDay."T16:00:00Z",
                    'url' => "http://aliahealthcareer.com/calendar/".$_GET['fetching']."/".$startDate);

                    array_push($printed, $newdateform);

        if ($weekType=="weekend"){
            $days="Saturday,Sunday";
        }
        if ($weekType=="day"){
            $days="Monday,Tuesday,Wednesday,Thuresday,Friday";
        }
        if ($weekType=="evening"){
            $days="Monday,Tuesday,Wednesday";
        }
        $start = $startDate;
        while($startDay <= $endDay) {
            $startDay = date('Y-m-d', strtotime($startDay. ' + 1 days'));
            $dayWeek = date("l", strtotime($startDay));
            $pos = strpos($dayWeek, $days);
            if ($pos !== false) {
                $newdateform = array(
                    'title' => date("M d", strtotime($start))."     to     ".date("M d", strtotime($endDate)). $type,
                    'start' => $startDate."T08:00:00Z",
                    'end' => $startDate."T16:00:00Z",
                    'url' => "http://aliahealthcareer.com/calendar/".$_GET['fetching']."/".$startDate);

                    array_push($printed, $newdateform);

            }

        }


    }

2
在当前作用域中,$printed 从未被初始化。要么将其声明为 global,要么将其包含在函数参数中。 - Matt
这是有关变量作用域的手册条目:http://php.net/manual/zh/language.variables.scope.php - Matt
4个回答

28
在调用array_push()的作用域中,$printed从未被初始化。可以将其声明为global或将其包含在函数参数中:
$printed = array();
.
.
.
function dayAdvance ($startDay, $endDay, $weekType){
    global $printed;
    .
    .
    .
}

或者

function dayAdvance ($startDay, $endDay, $weekType, $printed = array()) { ... }

注意:

一个比array_push()更快的替代方法是直接使用[]将值附加到数组中:

$printed[] = $newdateform;

该方法会自动检测变量是否未初始化,并在追加数据之前将其转换为数组(换句话说,不会出现错误)。

更新:

如果您希望$printed的值在函数外持续存在,必须通过引用传递它或将其声明为global。上述示例不等同于使用global。下面的示例将等同于使用global(实际上比使用global更好的做法是,这可以强制您在代码中更有意识地避免意外数据操作):

function dayAdvance ($startDay, $endDay, $weekType, &$printed) { ... }

我的全局变量理解有误,你的第一个代码示例澄清了这一点,我以为你可以在任何地方声明全局变量,而不仅仅是在需要它的地方。谢谢! - Osman
请注意,不建议以这种方式使用 global。更好的做法是通过引用传递数组。这将防止在未来无意中修改数据。 - Matt
打负分的原因是什么?这个答案不仅正确,而且解释了替代方法的正确使用,并促进了最佳实践。 - Matt
在 PHP 中,引用是不好的,应该尽可能避免使用。我更喜欢只返回 $printed 变量。(虽然没有数据验证) - PeeHaa

3

我尝试了这个,但仍然存在同样的问题 global $printed; $printed = array(); - Osman
你需要在函数声明后添加global关键字。我在我的问题中添加了一个链接,以了解有关变量作用域和全局变量的更多信息。 - maaudet

0

当您想要向数组添加单个元素时,使用$your_array[] = $element_to_be_added;代替函数array_push()

如文档中所述,如果数组为空,则会创建一个新数组:

注意:如果您使用array_push()向数组添加一个元素,最好使用$ array [] =,因为这样没有调用函数的开销。

并且:

注意:如果第一个参数不是数组,则array_push()会引发警告。这与$ var []行为不同,后者会创建一个新数组。

来自:http://php.net/manual/en/function.array-push.php


0

你需要使用 is_array 进行验证:

示例:

if (is_array($arNumbers)) {
    $cellid =  array_push($arNumbers, 0);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接