Php 将带有函数的变量传递给另一个变量并返回它

Php 将带有函数的变量传递给另一个变量并返回它,php,Php,因此,我试图在多种语言中实现这一点,这是一个从mysql获取时间戳的函数,然后将其转换为“几天前、一天前、一年前,等等” 但是如何使用函数将变量$days传递给$lang数组呢 解决方案 function time_ago($timestamp) { global $lang; $time_ago = strtotime($timestamp); $current_time = time(); $time_difference = $current_time - $time_ag

因此,我试图在多种语言中实现这一点,这是一个从mysql获取时间戳的函数,然后将其转换为“几天前、一天前、一年前,等等”

但是如何使用函数将变量$days传递给$lang数组呢

解决方案

function time_ago($timestamp) {
  global $lang;
  $time_ago = strtotime($timestamp);
  $current_time = time();
  $time_difference = $current_time - $time_ago;
  $seconds = $time_difference;
  $minutes = round($seconds / 60);
  $hours = round($seconds / 3600);
  $days = round($seconds / 86400);
  $weeks = round($seconds / 604800);
  $months = round($seconds / 2629440);
  $years = round($seconds / 31553280);
  if ($seconds <= 60){
    return $lang['time_just_now'];
  } else if ($minutes <= 60) {
    if ($minutes == 1){
      return $lang['time_one_minute_ago'];
    } else {
      return sprintf(_($lang['time_minutes_ago']), $minutes);
    }
  } else if ($hours <= 24){
    if ($hours == 1){
      return $lang['time_one_hour_ago'];
    } else {
      return sprintf(_($lang['time_hours_ago']), $hours);
    }
  } else if ($days <= 7){
    if ($days == 1){
      return $lang['time_one_day_ago'];
    } else {
      return sprintf(_($lang['time_days_ago']), $days);
    }
  } elseif($weeks <= 4.3) {
    if ($weeks == 1) {
      return $lang['time_one_week_ago'];
    } else {
      return sprintf(_($lang['time_weeks_ago']), $weeks);
    }
  } elseif($months <= 12) {
    if ($months == 1) {
      return $lang['time_one_month_ago'];
    } else {
      return sprintf(_($lang['time_months_ago']), $months);
    }
  } else {
    if ($years == 1) {
      return $lang['time_one_year_ago'];
    } else {
      return sprintf(_($lang['time_years_ago']), $years);
    }
  }
}

感谢arkadianriver的创意

您的
$days
变量已在函数的中定义。因此,听起来您只是想将一个变量与两边的字符串组合起来

在这种情况下,您正在寻找:

$lang['time_days_ago'] = "hace $days días";
或:

请注意,这只在函数的内部起作用,因此如果要返回该赋值,则需要在函数本身内部进行赋值:

if ($days == 1){
  return $lang['time_days_ago'] = "hace un día";
} else {
  return $lang['time_days_ago'] = "hace" . $days . "días";
}

数组是一个很好的主意,但您的案例恰恰是它的一部分。您可以使用函数而不是数组,就像使用它的
\uu()
函数一样。函数可以处理字符串,同时考虑在语言消息文件中传递的任何位置变量(在代码本身中表示字符串和变量时,可以使用sprintf)

例如,如果使用gettext,它的用法如下:

返回sprintf(u(“现在的时间是%d.),$timestamp);

对于有复数形式的翻译,您需要使用ngettext:

返回sprintf(ngettext(“%d分钟前”。、“%d分钟前”。、$minutes)$minutes);

然后,您可以在包含字符串翻译的POT文件中重新排列位置参数,但需要重新排列。复数形式有很多复杂之处,西班牙语(和英语)有两个复数形式,而像俄语这样的语言至少有三个复数形式,这取决于数字。如果你雇佣国内翻译人员,他们对这类事情非常了解,可能对gettext很熟悉


如果gettext的许可或生产要求是您无法接受的,那么您可能可以使用类似的原则和函数,如
getLangString('my_key_string',array($parm1,$parm2))
并让函数使用该键和所提供参数的值来确定要从翻译的消息文件中提取哪些字符串。对不起,我没有足够的资金来提供这样一个功能,但你可能已经明白了。考虑到各种语言规则,这是一个相当复杂的过程,这就是为什么有这样的库。我希望这件事能继续下去,很酷。

谢谢你的回答!我试过了,但它给了我一个未定义的$days变量,因为它没有在数组中设置,数组在不同的php文件“en.php”、“es.php”中,我看到了。您正在基于全局
$lang
变量在函数外部进行赋值。您真正应该做的是返回已分配的值<代码>$days仅存在于函数内部。因此,使用时间戳调用函数,并使用
return$lang['time\u days\u ago']=“hace”返回指定的值$天。“迪亚斯”。我明白了,但是对于不同的语言,它不会像那样工作,因为gramar:在英语中是“$days ago”,在西班牙语中是“hace$days días”。这就是为什么我返回变量$lang['time_days_ago'];有用于国际化的库,您可能应该使用一个,而不是自己设计。谢谢@Barmar,我将在另一个项目中实现该库:)您编写的解决方案实际上无法与gettext一起使用。gettext函数()只接受静态字符串。当您准备好翻译时,gettext有一个外部函数,它读取您的代码以查找静态字符串,并将这些字符串用作消息文件中的字符串值。非常感谢,这是一个简单的修复方法!以下是Mozilla关于在PHP中使用gettext的快速参考:
$lang['time_one_year_ago'] = 'hace un año';
$lang['time_years_ago'] = 'hace %s años';
$lang['time_days_ago'] = "hace $days días";
$lang['time_days_ago'] = "hace" . $days . "días";
if ($days == 1){
  return $lang['time_days_ago'] = "hace un día";
} else {
  return $lang['time_days_ago'] = "hace" . $days . "días";
}