2010-09-11 123 views
1

我想從函數內部訪問數組數據,但不斷收到錯誤:Undefined varaible:status。任何想法如何糾正?PHP函數中的數組

<?php 

$state = 'New York'; 

function state_values($state){ 
    switch ($state) { 
     case 'New York': 
      echo "State is $state"; 
      $status = array("abbr" => "NY", "code" => "03"); 
      return $status; 
      break; 
     case 'California': 
      echo "State is $state"; 
      $status = array("abbr" => "CA", "code" => "06"); 
      return $status; 
      break; 
     case 'Washington': 
      echo "State is $state"; 
      $status = array("abbr" => "WA", "code" => "05"); 
      return $status; 
      break; 
    } 
} 

# Call the function 
state_values($state); 


echo $status['abbr']; 
echo $status['code']; 


?> 

回答

10

你必須從你的函數調用的返回值存儲在一個變量

$answer = state_values($state); 

echo $answer["abbr"]; 

echo $answer["code"]; 
0

您不會將函數中的值返回給變量。

$status = state_values($state); 
0

正弦它返回值,你也必須給變量賦值。

$status = state_values($state);會這樣做。

1

由於$status正在函數state_values中聲明爲局部變量,除非將返回的值保存到另一個變量,否則不能從函數外部訪問它。

爲了捕獲返回的$status變量,下面的代碼應該如下所示。

$status = state_values($state); 

echo $status['abbr']; 
echo $status['code']; 

PHP文檔在variable scope上有一個很好的部分。


雖然它不處理它一個很好的方法,你可以使用全局變量$status這個樣子做:

$state = 'New York'; 
$status = array(); 

function state_values($state){ 
    global $status; 

    switch ($state) { 
     case 'New York': 
      echo "State is $state"; 
      $status = array("abbr" => "NY", "code" => "03"); 
      break; 
     case 'California': 
      echo "State is $state"; 
      $status = array("abbr" => "CA", "code" => "06"); 
      break; 
     case 'Washington': 
      echo "State is $state"; 
      $status = array("abbr" => "WA", "code" => "05"); 
      break; 
    } 
} 

# Call the function 
state_values($state); 

echo $status['abbr']; 
echo $status['code']; 

在上面,我們聲明$status該函數,然後指定裏面的這個函數$status是一個全局變量。在調用state_values期間發生的對$status的任何更改均會更改變量的全局副本。

就像我說的那樣,這使得混淆&很難保持代碼,所以你最初的方法更好。以上內容更多地說明全局變量如何工作。

+0

-1請甚至不談論全局的人誰顯然不準備聽到的答案不搞亂 – 2010-09-16 13:46:53

+0

我仍然認爲這是一個這個問題的未來讀者的有效點。但我試圖更清楚地表明,我認爲全球方法並不理想。 – 2010-09-16 14:38:56

0

那麼,你必須指定返回值,如:

$status = state_values($state); 

你聲明變量$status該功能僅在從功能訪問,碼。

您不能從函數內部訪問數組!你只在那裏定義它。


順便說一句,你可以通過只在函數結束返回數組和曾經只是呼應提高你的函數(適用於DRY-principle (Don't Repeat Yourself)):

function state_values($state){ 
    echo "State is $state"; 

    // initialize the variable with an empty array 
    $status = array(); 

    switch ($state) { 
     case 'New York': 
      $status = array("abbr" => "NY", "code" => "03"); 
      break; 
     case 'California': 
      $status = array("abbr" => "CA", "code" => "06"); 
      break; 
     case 'Washington': 
      $status = array("abbr" => "WA", "code" => "05"); 
      break; 
    } 
    return $status; 
} 

更新:

關於評論:當然有各種方法可以使功能更好,例如使用查找表:

//... 
$states = array('New York' => array("NY","03"), 
       'California' => array("CA","06"), 
       'Washington' => array("WA","05")); 

if(isset($states[$state])) { 
    return array_combine(array('abbr', 'code'), $states[$state]); 
} 
return array(); 
//.. 

但是,這不是問題;)

+0

我會說,即使這個是不夠幹;) – 2010-09-11 12:58:26

0

我不得不說,整個概念是錯誤的。 它應該不是一個函數,或者至少不是這種形式。

$state = 'New York'; 

function state_values($state){ 
    return dbgetrow("SELECT * FROM states WHERE name = %s",$state); 
} 
$status = state_values($state); 
echo "State is $state, abbr is ".$status['abbr']; 

,或者至少讓它只是陣列

$state_values = array(
    'New York' => array("abbr" => "NY", "code" => "03"), 
    'California' => array("abbr" => "CA", "code" => "06"), 
    'Washington' => array("abbr" => "WA", "code" => "05"), 
); 

echo $state_values[$state]['abbr']; 
+0

@stereofrog這是所有正確的brotha。我有時間留出好的建議。沒問題。歡呼:) – 2010-09-11 13:15:46

+0

@stereofrog是的,確切地說。不要太擔心我花費的時間和精力。對於OP面臨的問題,我有更好的解決方案,我很高興與大家分享。一個很好的答案總是值得的,不是嗎?可能不是OP,但其他人會從我的答案中學習更好的做法。你不覺得有什麼不好嗎? – 2010-09-11 13:54:45