将多个变量作为数组返回并提取它们

时间:2016-01-01 17:22:41

标签: php

我有一个从表中获取数据的函数,并且有多个列(变量)。我需要从函数中返回所有变量才能使用它们。

我尝试了多种方法,但我无法使其发挥作用:

return array($var, $var2, $var3, $etc);

return compact($var, $var2, $var3, $etc);

现在我使用extract(),但我做错了什么:

$data = $functions->my_function($id);

// I must check first if there are results
// will this work?
if (is_array($data)) {
    extract($data);
    // now I can use the variables from the function:
    echo $var, $var2, $var3, $etc;
}

而不是一个一个地声明变量:

$var = $data[0];
$var2 = $data[1];

也许问题是变量名称?

$stmt->bind_result($id, $use, $type, $status, $bhk, $baths, $area_1, $area_2, $city, $zone, $sale_price, $monthly_price, $description);

我读过有关错误变量名称的内容将无法在php.net评论中使用extract()

1 个答案:

答案 0 :(得分:1)

extract无效的原因是您需要返回associative array。您可以手动执行此操作,也可以通过传递变量名称而不是变量值来正确使用compact

function my_function() {
    $var = 'Happy';
    $var2 = 'New';
    $var3 = 'Year';
    return array(
        'var'  => $var,
        'var2' => $var2,
        'var3' => $var3
        // ... etc ...
    );
    // Alternate method, with compact
    return compact('var', 'var2', 'var3');
}

$values = my_function();
extract($values);
echo $var; // outputs 'Happy'
echo $var2; // outputs 'New'
echo $var3; // outputs 'Year'

修改
提取物不是最佳实践。在阅读代码时,突然出现变量是一个谜,并使其难以维护。

最好是从数组中明确检查/获取值:

$values = my_function();
$var  = $values['var'];
$var2 = $values['var2'];
$var3 = $values['var3'];
echo $var; // outputs 'Happy'
echo $var1; // outputs 'New'
echo $var3; // outputs 'Year'

根据代码的结构,您必须决定是否可以依赖该函数来始终返回这些值,或者是否需要检查它们。如果你需要检查多个键/值,那么我通常喜欢为这类事情编写一个实用函数:

function get_val( $key, $array, $default = FALSE) {
    $array = (array)$array;
    return ( isset( $array[ $key ] ) ) ? $array[ $key ] : $default;
}

然后,你就像这样使用它:

$values = my_function();
$var  = get_val( 'var', $values );
$var2 = get_val( 'var2', $values );
$var3 = get_val( 'var3', $values );
echo $var; // outputs 'Happy'
echo $var1; // outputs 'New'
echo $var3; // outputs 'Year'

最后,从数据库返回行的函数应该负责执行验证/返回有意义的内容。例如,如果没有行,则返回FALSE,那么您可以这样检查:

function my_function( $id ) {
     // your code to get the row based on the id

     // then, check that a row was returned...
     if ( ! count( $row ) ) {
          return FALSE;
     } else {
          // return the row
     }
}

$values = my_function();
if ( $values !== FALSE ) {
    // do stuff, because we know we have a valid row
}