1

我想在php中进行以下转换:

from: "0110001" to: "Tuesdays, Wednesdays, Sundays".

这样做的奖励积分:

from: "0110001" to: "Tuesdays, Wednesdays and Sundays".

输入是七个字符,每个字符代表一周中的一天。

如果没有 foreach 循环,我怎么能做到这一点?我想使用 array_walk 或 array_reduce。


工作解决方案,但有一个 foreach :

<?php

    function parseDays($str) {
      $days = array("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday");
      $result = array();
      foreach (str_split($str) as $k=>$v) {
        if ($v == '1') {
          $result[] = $days[$k];
        }
      }
      return join(', ', $result);
    }

echo parseDays("0110001");
4

3 回答 3

5

您可以只使用内置函数来完成第一个版本:

$daynames = array(
    'Mondays', 'Tuesdays', // etc
);

$in = "0110001";
echo implode(', ', array_intersect_key($daynames, array_filter(str_split($in))));

这是如何工作的:

  1. 将输入拆分为 1 和 0 数组;至关重要的是,这个数组的键与$daynames.
  2. 过滤掉零;幸运的是array_filter保留了密钥。
  3. 用于array_intersect_key将键映射到$daynames.
  4. 用于implode制作以逗号分隔的上述列表。

如果您想将最后一个逗号转换为"and",最简洁的方法是正则表达式(我个人认为这个解决方案有问题,尽管不可否认它有效):

echo preg_replace('/,(?=[^,]+$)/', ' and', implode(...));

然而

请不要忘记,最好的代码是不存在的代码(保证零错误!),其次是闭上眼睛就能理解的代码。

上面的代码当然不属于这些类别。我的专业建议是,foreach如果这会导致要维护它的人熟悉的代码,则使用它。

于 2013-02-21T14:06:05.067 回答
0
<?php

$bits = array();
$bits = str_split("0110001");

function print_day($key, $item) {

  $days_of_the_week = array(
    "0" => "Mondays",
    "1" => "Tuesdays",
    "2" => "Wednesdays",
    "3" => "Thursdays",
    "4" => "Fridays",
    "5" => "Saturdays",
    "6" => "Sundays",
  );

  if ($key) {
    echo $days_of_the_week[$item] . " ";
  }
}

array_walk($bits, 'print_day');

?>
于 2013-02-21T14:25:33.840 回答
0

这应该做你需要做的事情

function convertDays($input) {
    $days = array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
    $dayNames = array_intersect_key($days, array_filter(str_split($input)));

    if (count($dayNames) < 2) {
        return implode(', ', $dayNames);
    }

    $commaSeparatedDays = array_slice($dayNames, 0, -1);
    return implode(', ', $commaSeparatedDays) . ' and ' . end($dayNames);
}
于 2013-02-21T14:10:11.093 回答