2012-08-30 69 views
3

這是我的代碼,當我運行這個函數時,我得到這個:Warning: array_push() expects parameter 1 to be array但是我在開始之前將$printed定義爲數組。Warning:array_push()期望參數1是數組

$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'從未被初始化。將其聲明爲「全局」或將其包含在函數參數中。 – Matt

+0

[這裏是變量範圍的手動輸入](http://php.net/manual/en/language.variables.scope.php) – Matt

回答

13

在範圍中array_push()叫,$printed從未被初始化。無論是在功能的參數聲明爲global或包含它:

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

OR

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

注:

更快替代array_push()是簡單地使用附加的值傳送到陣列[]

$printed[] = $newdateform; 

此方法將自動檢測變量是否從未初始化,並在追加數據(換句話說,無錯誤)之前將其轉換爲數組。

UPDATE:

如果你想的$printed價值堅持的功能之外,您必須按引用傳遞,或聲明爲global。上面的例子是不等於。下面的例子就相當於使用global(並且,事實上,比使用global一個更好的做法 - 它迫使你與你的代碼更加審慎,防止意外的數據操作):

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

我對全球的瞭解已經關閉,你的第一個代碼示例將其清除了,我認爲你在任何地方聲明瞭全局,而不僅僅是你需要它的地方。謝謝! – Osman

+0

請注意,不建議以這種方式使用'global'。更好的做法是通過引用傳遞數組。這將防止將來無意中修改數據。 – Matt

+0

降票的原因是什麼?這個答案不僅是正確的,但它解釋了正確使用替代方法,並推廣最佳實踐。 – Matt

2

您需要使用global $printed;或添加$printed作爲函數參數。

您還可將$printed參數作爲在功能參考:http://php.net/manual/en/language.references.pass.php

更多關於全球和可變範圍:http://php.net/manual/en/language.variables.scope.php

+0

我試過這個問題,但仍然是同樣的問題全局'$印; $ printed = array();' – Osman

+0

你需要在你的函數聲明後添加全局變量。我在問題中添加了一個鏈接,以瞭解更多關於變量作用域和全局變量的信息。 – Manhim

+0

謝謝,我明白了! – Osman

0

相反的函數array_push()使用$your_array[] = $element_to_be_added;當你想添加一個元素到數組中。

如文檔提到,這將創建一個新的數組,如果數組爲空:

注:如果您使用array_push()將一個元素添加到陣列中,最好使用$陣列[ ] =因爲這樣就沒有調用函數的開銷。

和:

注意:如果第一個參數不是數組array_push()將引發警告。這與創建新數組的$ var []行爲不同。

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

相關問題