【问题标题】:Is it possible that a function can return 2 or more values with different data types in php? [duplicate]一个函数是否有可能在 php 中返回 2 个或多个具有不同数据类型的值? [复制]
【发布时间】:2017-05-19 13:51:21
【问题描述】:
//sample Pseudo Code
function djikstra($source, $destination){
   //after some computations....
   return $distance_taken, $path;
}

$distance_taken 是一个整数,$path 是一个数组。

【问题讨论】:

  • 以数组形式返回
  • 返回arrayobjectjson
  • 可以返回数组或标准对象或json
  • return [$distance_taken, $path];
  • 请给我看一些sn-ps?

标签: php parameters return-value type-conversion return-type


【解决方案1】:

您不能返回多个值。但是你可以返回一个数组:

function djikstra($source, $destination){
   //after some computations....
   return [$distance_taken, $path];
}

所以当你调用这个函数时,你可以利用list来获取值:

list($distance_taken, $path) = djikstra($source, $destination);

【讨论】:

  • 非常感谢...让我试试这个。
  • 现在太棒了!谢谢我欠你很多! :-)
【解决方案2】:

你可以只返回一个值或不返回值

return array('distance_token' => $distance_taken, 'path' => $path);

然后通过

访问它们
$result = djikstra($source, $destination);
$distance_taken = $result['distance_token'];
$path = $result['path'];

【讨论】:

  • 你试过这个吗?
  • 是的,有效!
【解决方案3】:

函数总是返回一种类型。如果变量类型相同,则可以使用数组。

但最好的方法是创建一个对象

<?php

class DikjstraObj {

  var $source;
  var $destination;

  function __construct($source, $destination) {
    $this->source = $source;
    $this->destination = $destination;
  }

}

// ///////////////

// in your function simply do 
function djikstra($source, $destination){

  //after some computations....
  $dObj = new DikjstraObj($source, $destination);

  return $dObj ;
}

【讨论】:

    【解决方案4】:

    你基本上不能,但你可以创建一个类。 PHP 文档:http://php.net/manual/en/language.oop5.php

    【讨论】:

      【解决方案5】:

      使用Array

      return array('distance_taken' => $distance_taken, 'path' => $path);
      

      使用JSON

      return json_encode(array('distance_taken' => $distance_taken, 'path' => $path));
      

      【讨论】:

        【解决方案6】:

        好吧,既然不能不参考,我也放一个答案,总结一下其他的货:

        参考方式(又名C指针样)

        Reference 可以在您想直接使用变量而不制作临时副本并返回新值以擦除旧值时使用。这是 C 语言的工作方式,可以提高大变量操作的性能。

        要使用引用,您只需在函数参数的$ 之前放置一个&amp;

        <?
        function djikstra(&$source, &$destination){
            //after some computations....
            $source = 'new val 1';
            $destination = 'new val 2';
        
                // return can be omited or used to handle & return error 
            return ; 
        }
        
            // init
        $source = 'default val 1';
        $destination = 'default val 2';
        
            // will change the val on the fly
        djikstra($source, $destination);
        
            // will print "new val 1 - new val 2"
        echo $source. ' - ' .$destination;
        

        其他商品方式:

        数组()

        正如@Thamilan 所说,这可能是最常见的方式。

        您不能返回多个值。但是你可以返回一个数组:

        function djikstra($source, $destination){
           //after some computations....
           return [$distance_taken, $path]; 
           // or `return array($distance_taken, $path)`
        }
        

        所以当你调用这个函数时,你可以利用list来获取 价值观:

        list($distance_taken, $path) = djikstra($source, $destination);
        

        注意:小心list(),这是一个很难使用的函数,请阅读文档

        对象

        如果您已经使用面向对象样式编码,@Topsy 也是一个好方法,因为您必须将函数应用于完整对象并期望完整修改的对象返回。

        如果您从事程序性工作,请避免这种情况并选择 #1 或 #2。

        函数总是返回一种类型。你可以使用一个数组,如果你 变量是同一类型。

        但最好的方法是创建一个对象

        <?php
        
        class DikjstraObj {
        
          var $source;
          var $destination;
        
          function __construct($source, $destination) {
            $this->source = $source;
            $this->destination = $destination;
          }
        
        }
        
        // ///////////////
        
        // in your function simply do 
        function djikstra($source, $destination){
        
          //after some computations....
          $dObj = new DikjstraObj($source, $destination);
        
          return $dObj ;
        }
        

        【讨论】:

        • 感谢@Blag,这会有所帮助
        猜你喜欢
        • 2013-12-16
        • 1970-01-01
        • 1970-01-01
        • 2016-01-29
        • 1970-01-01
        • 2021-09-03
        • 1970-01-01
        • 1970-01-01
        • 2012-03-19
        相关资源
        最近更新 更多