我有一个从表中获取数据的函数,并且有多个列(变量)。我需要从函数中返回所有变量才能使用它们。
我尝试了多种方法,但我无法使其发挥作用:
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()
。
答案 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
}