2010-09-11 117 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