更改函数以返回数组而不是字符串。太难了?

时间:2013-06-20 06:51:03

标签: php

我有一个像这样的PHP函数:

function count_nutrient_value($input){
 // some difficult operations here
 return $output; // this is a string
}

我正在使用这个(例子):

$print .= 'This nutrient is giving you '.count_nutrient_value(40).' percent.';

现在的问题是,从函数中,我需要返回另一个值 - 数字是上升还是下降的信息。所以我改变了功能:

function count_nutrient_value_new($input){
 // some difficult operations here
 return array($output,$status); // this is an array, obviously
}

但现在我不能轻易使用这个功能,因为我不能再这样做了:

$print .= 'This nutrient is giving you '.count_nutrient_value_new(40).' percent.';

但相反,我需要将它扩展到更多行,如下所示:

$return = count_nutrient_value_new(40);
$print .= 'This nutrient is giving you '.$return[0].' percent.';

这种情况有解决方案吗?这将是:

A)不从函数返回数组(但以其他方式解决问题)
B)返回一个数组,找到一种在代码中使用该函数的更简单方法 C)其他?

6 个答案:

答案 0 :(得分:4)

您为每个目的制作两个功能,并从另一个中调用一个。

function count_nutrient_value_string( $input ){
    $array = count_nutrient_value_array( $input );
    return $array[ 0 ];
}

function count_nutrient_value_array( $input ){
     // some difficult operations here
     return array( $output, $status ); 
}

$print .= 'This nutrient is giving you '.count_nutrient_value_string(40).' percent.';

(函数名称应优于_string_array,具体取决于他们实际执行的操作。)

答案 1 :(得分:2)

我会避免更改函数的签名,因为它可能会破坏某些代码。相反,我宁愿添加并调用一个新函数。

无论如何,如果我必须按照你在这里描述的方式更改函数,我会使用utilisty类而不是数组。

  • 该课程有两个属性:$ count和$ status,yuo是否公开是一个方便的问题。在你的情况下,我猜公众的态度很好。
  • 该类还可以实现__toString()方法,以保持旧代码的兼容性。

类似的东西:

class nutrientResults {

    public $status = SOME_DEFAULT_VALUE;
    public $count = 0;

    public function __construct($count, $st = SOME_DEFAULT_VALUE) {
         $this->count = $count;
         $this->status = $st;
    }

    public function __toString() {
        return (string) $this->count;
    }

}

然后:

function count_nutrient_value($input){
    // some difficult operations here
    return new nutrientResults($count, $status);
}

$print .= 'This nutrient is giving you '.count_nutrient_value(40).' percent.';
// as usual..., so backwards compatibility maintained

答案 2 :(得分:0)

您可以使用输出参数。

function count_nutrient_value($input, &$out1, &$out2){
 // some difficult operations here
 $out1 = $output[0];
 $out2 = $output[1];
 return $output[0]; // return the same
}

$print .= 'This nutrient is giving you '.count_nutrient_value(40, $o1, $o2).' percent.';
// Do other things with $o1 and $o2.

在php 5中,您还可以使用可选参数:

function count_nutrient_value($input, &$out1 = '', &$out2 = ''){
 // some difficult operations here
 $out1 = $output[0];
 $out2 = $output[1];
 return $output[0]; // return the same
}

// Call without out parameters
$print .= 'This nutrient is giving you '.count_nutrient_value(40).' percent.';

答案 3 :(得分:0)

将该函数转换为一个小类,$output和$ status作为属性:

class count_nutrient_value() {
public $output;
public $status;
function __construct($input) {
   // Do complicate stuff here
   $this->output = $output_result;
   $this->status = $status_result;
}
}

然后你可以做

$nutrient = new count_nutrient_value($input);
$print .= 'This nutrient is giving you '.$nutrient->output.' percent.';

答案 4 :(得分:0)

分割数据源和一些存取器/变换器中的功能可能是正确的选择 如果您正在使用数据源返回的数组/对象的全部(或大部分)信息,那么最好还是存储/更改一次,而不是每次调用访问器函数时重新创建。
现在,作为您现在所拥有的内容的简单替代,请查看 v printf函数系列。他们不使用省略号(printf($format, ...),例如printf('%d %s %d', 1,'a', 3)),而是使用一组参数:vprintf('%d %s %d', array(1,'a', 3)),可以很容易地从另一个函数传递或传递给另一个函数。

<?php
function count_nutrient_value($input) {
    return array($input*0.1, ' approved');
}

$result = vsprintf('This%2$s nutrient is giving you %1$d percent.', count_nutrient_value(40));
echo $result;

请参阅http://docs.php.net/function.vsprintf

答案 5 :(得分:-2)

您可以使用示例代码返回数组值:

function count_nutrient_value_new($input){
 // some difficult operations here
 return array('output' => $output, 'status' => $status); // this is an array, obviously
}

然后得到的值是:

$print .= 'This nutrient is giving you '.$return["output"].' percent.';