Доступ к переменной в функции, отличной от возвращаемого значения - PullRequest
1 голос
/ 21 марта 2011

Мне нужна помощь, чтобы понять эту проблему, с которой я сталкиваюсь ... и извинения, если она кажется глупой.

Я написал функцию, которая делает некоторые вычисления в соответствии с двумя разными датами (прибытие и отъезд).Все работает нормально, возвращаемые значения заданы, и это правильно.

Тем не менее, пока выполняется этот расчет, создается переменная ($ days), которую я хотел бы использовать (echo) вне функции.Я пытался сделать его глобальным, но получаю ошибку ... догадываясь, что я на неправильном пути!

Итак, мой вопрос: как получить значение внутри функции, отличной от возвращаемого значения?если это вообще возможно, конечно.

код ниже:

function costs($date1, $date2, $price) {

$arr= explode("/", $date1);
$timestamp1 = mktime(0,0,0,$arr[1],$arr[0],$arr[2]);

$arr2= explode("/", $date2);
$timestamp2 = mktime(0,0,0,$arr2[1],$arr2[0],$arr2[2]);

$timestamp = $timestamp2 - $timestamp1;
$days = $timestamp/86400;

$cost = $days * $price;

return $cost;

}     

Ценю любую небольшую помощь, чтобы понять это.Francesco

Ответы [ 6 ]

0 голосов
/ 21 марта 2011

Либо верните массив из вашей функции, либо отправьте ссылку на назначение в функцию посредством параметра.

list ($cost, $return_days)=costs("01/03/2011", "17/03/2011", 100, $ref_days);
// $ref_days and $return_days now hold the same value

function costs($date1, $date2, $price, &$days) {
  ...
  $days = $timestamp/86400;
  $cost = $days * $price;
  return array($cost,$days);
}     
0 голосов
/ 21 марта 2011

Если у вас есть значение $ cost, возвращаемое функцией, и вы знаете значение $ price, которое вы передаете в функцию при вызове;тогда

$days = $cost / $price;
0 голосов
/ 21 марта 2011

Это должны быть две отдельные функции, одна из которых использует другую.

function costs($date1, $date2, $price) {
    $cost = days($date1, $date2) * $price;
    return $cost; 
}

function days($date1, $date2) {
    $arr= explode("/", $date1); 
    $timestamp1 = mktime(0,0,0,$arr[1],$arr[0],$arr[2]); 

    $arr2= explode("/", $date2); 
    $timestamp2 = mktime(0,0,0,$arr2[1],$arr2[0],$arr2[2]); 

    $timestamp = $timestamp2 - $timestamp1; 

    return $timestamp/86400;
}

РЕДАКТИРОВАТЬ: Затем вы можете вызывать любую функцию в зависимости от того, что вы хотите, без дублирования кода.

Не похоже, что вы используете объекты, поэтому я не дам вам OO spiel, но вы определенно можете разделить их на отдельные функции, чтобы вы не делали странные вещи с глобальными переменными и запутывали свои пространства имен.

0 голосов
/ 21 марта 2011

В вашей функции включите необязательный параметр.Если это установлено, то вернуть дату / вместо / разницы.

<?php
function fn($arrival, $departure, $getDate = FALSE)
{
  //your function stuff
  ...

  //if optional flag is set, then return number of days.
  if($getDate)
  {
    return $days;
  }

  //if flag not set, then return original value.
  return $values;
}
0 голосов
/ 21 марта 2011

Вы можете обернуть его в классе, чтобы получить доступ к $ days.

`

class Something {
  public $days;

  public function calc($arrival, $departure)
  {
    // Do your thing
    $this -> days = $days;
    return $something;
  }

  public function getDays()
  {
    return $this -> days;
  }
}

`

0 голосов
/ 21 марта 2011

Для конкретного кода ур ... попробуйте это

function costs($date1, $date2, $price) {

$arr= explode("/", $date1);
$timestamp1 = mktime(0,0,0,$arr[1],$arr[0],$arr[2]);

$arr2= explode("/", $date2);
$timestamp2 = mktime(0,0,0,$arr2[1],$arr2[0],$arr2[2]);

$timestamp = $timestamp2 - $timestamp1;
$days = $timestamp/86400;

$cost = $days * $price;

$arr = array();
$arr['cost'] = $cost;
$arr['days'] = $days;
return $arr;

} 
...