Возможно ли, что функция может возвращать 2 или более значений с разными типами данных в php?

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

$distance_taken — целое число, а $path — массив.


person deLegend    schedule 05.01.2017    source источник
comment
вернуть как массив   -  person Lenin Raj Rajasekaran    schedule 05.01.2017
comment
Вернуть array или object или json   -  person Ramalingam Perumal    schedule 05.01.2017
comment
Вы можете вернуть массив или стандартный объект или json   -  person justrohu    schedule 05.01.2017
comment
Пожалуйста, покажите мне несколько фрагментов?   -  person deLegend    schedule 05.01.2017
comment
Может ли массив содержать много типов данных, например: $this_array[0]= *целое число AND $this_array[1]= *массив?   -  person deLegend    schedule 05.01.2017
comment
Да, массив — это набор значений любого типа данных!   -  person Thamilhan    schedule 05.01.2017


Ответы (6)


Вы не можете вернуть более одного значения. Но вы можете вернуть массив:

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

Поэтому, когда вы вызываете эту функцию, вы можете использовать list для получения значений:

list($distance_taken, $path) = djikstra($source, $destination);
person Thamilhan    schedule 05.01.2017
comment
Большое спасибо... Позвольте мне попробовать это. - person deLegend; 05.01.2017
comment
Вот это было круто! Спасибо, я вам многим обязан! :-) - person deLegend; 05.01.2017

Вы можете просто вернуть одно значение или не вернуть его

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

Затем получите доступ к ним с помощью

$result = djikstra($source, $destination);
$distance_taken = $result['distance_token'];
$path = $result['path'];
person LF00    schedule 05.01.2017
comment
Вы пробовали этот? - person deLegend; 05.01.2017
comment
да, это работает! - person LF00; 05.01.2017

Функция всегда возвращает один тип. Вы можете использовать массив, если ваши переменные одного типа.

Но лучший способ сделать это - создать объект

<?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 ;
}
person Topsy    schedule 05.01.2017

Вы не можете в принципе, но вы можете создать класс. Документация по PHP: http://php.net/manual/en/language.oop5.php

person Anthony Gladiator    schedule 05.01.2017

Используйте 1_

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

Используйте JSON

return json_encode(array('distance_taken' => $distance_taken, 'path' => $path));
person Ramalingam Perumal    schedule 05.01.2017

Хорошо, так как мы не можем обойтись без ссылки, я тоже ставлю ответ и резюмирую другие хорошие:

Эталонный путь (например, указатель C)

Справочник можно использовать, когда вы хотите напрямую работать с переменной без создание временной копии и возврат нового значения для удаления старого. Именно так работает язык 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);

Примечание: будьте осторожны с 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 ;
}
person Blag    schedule 05.01.2017
comment
Спасибо @Blag, это поможет - person deLegend; 05.01.2017