是否有可能函数可以在php中返回具有不同数据类型的2个或更多值?

时间:2017-01-05 05:35:02

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

//sample Pseudo Code
function djikstra($source, $destination){
   //after some computations....
   return $distance_taken, $path;
}

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

6 个答案:

答案 0 :(得分:3)

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

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

因此,当您调用此函数时,您可以使用list来获取值:

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

答案 1 :(得分:1)

您只需返回一个值或不返回值

using System;
using System.Linq;
using System.Reflection;

namespace ConsoleApplication2
{
    public static class Files
    {
        public const string FileA = "Block1";
        public const string FileB = "Block2";
        public const string FileC = "Block3";
        public const string FileD = "Block6.Block7";
    }

    internal class Program
    {
        private static void Main(string[] args)
        {
            var t = typeof(Files);
            var fields = t.GetFields(BindingFlags.Static | BindingFlags.Public);

            var list = fields.Select(x => new {Field = x.Name, Value = x.GetValue(null).ToString()});


            Console.Read();
        }
    }
}

然后通过

访问它们
return array('distance_token' => $distance_taken, 'path' => $path);

答案 2 :(得分:1)

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

但最好的方法是创建一个Object

<?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 ;
}

答案 3 :(得分:0)

使用Array

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

使用JSON

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

好的,因为我们无法参考,我也给出了答案,并总结了其他商品:

参考方式(AKA C指针一样)

当你想直接使用变量而不进行临时复制并返回一个新值来擦除旧值时,可以使用

Reference。这是C语言的工作方式,可以提高大变量操作的性能。

要使用引用,您只需在&函数参数前加$

<?
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);

Nb:小心使用list(),这是一个棘手的功能,请阅读文档

对象

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

如果您在程序中工作,请避免这种情况并转到#1或#2。

  

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

     

但最好的方法是创建一个Object

<?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 ;
}