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

时间:2018-05-30 23:00:14

标签: php

所以我试图为多种语言完成这项工作,它是一个从mysql获取时间戳然后将其转换为“几天前,一天前,一年前等”的函数。

function time_ago($timestamp, $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 $lang['time_minutes_ago'];
    }
  } else if ($hours <= 24){
    if ($hours == 1){
      return $lang['time_one_hour_ago'];
    } else {
      return $lang['time_hours_ago'];
    }
  } else if ($days <= 7){
    if ($days == 1){
      return $lang['time_one_day_ago'];
    } else {
      return $lang['time_days_ago'];
    }
  } elseif($weeks <= 4.3) {
    if ($weeks == 1) {
      return $lang['time_one_week_ago'];
    } else {
      return $lang['time_weeks_ago'];
    }
  } elseif($months <= 12) {
    if ($months == 1) {
      return $lang['time_one_month_ago'];
    } else {
      return $lang['time_months_ago'];
    }
  } else {
    if ($years == 1) {
      return $lang['time_one_year_ago'];
    } else {
      return $lang['time_years_ago'];
    }
  }
}

我有一个基于语言会话的系统,它从数组中获取所有数据

$lang['time_one_day_ago'] = 'hace un día';
$lang['time_days_ago'] = "hace {$days} días";

但是如何使用函数将变量$ 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);
    }
  }
}

然后在语言文件中

$lang['time_one_year_ago'] = 'hace un año';
$lang['time_years_ago'] = 'hace %s años';

感谢arkadianriver的想法!

2 个答案:

答案 0 :(得分:1)

阵列是一个很好的想法,但你的情况正是它崩溃的地方。您可以使用函数代替数组,就像gettext对其_()函数所做的那样。函数可以处理字符串,同时考虑语言消息文件中传递的任何位置变量(并且在代码本身表示字符串和变量时可以使用sprintf)。

例如,如果你使用gettext,它的用法就像:

return sprintf(_('The time now is %d.'), $timestamp);

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

return sprintf(ngettext('%d minute ago.', '%d minutes ago.', $minutes) $minutes);

然后,您可以在包含字符串翻译的POT文件中重新排列位置参数。复数的复杂性以及西班牙语(和英语)有两种,而俄语这样的语言至少有3种,具体取决于数字。如果您聘请国内翻译人员,他们会敏锐地意识到这样的事情并且可能熟悉gettext。

如果gettext的许可或生产要求是您无法忍受的,您可以使用与getLangString('my_key_string',array($parm1,$parm2));之类的函数类似的原则,并让函数使用该键和提供的参数的值确定从翻译的消息文件中获取哪些字符串。对不起,我没有wherewithall来提供这样一个功能的胆量,但你可能会得到这个想法。这是一个非常复杂的过程,考虑到各种语言规则,这就是为什么有这样的东西的库。我希望这可以继续下去。 Have a look at gettext,这很酷。

答案 1 :(得分:0)

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

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

$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";
}