字符串在PHP中按字符解析而没有foreach

Ben*_*ier 1 php string parsing

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

from: "0110001" to: "Tuesdays, Wednesdays, Sundays".
Run Code Online (Sandbox Code Playgroud)

这样做的加分点:

from: "0110001" to: "Tuesdays, Wednesdays and Sundays".
Run Code Online (Sandbox Code Playgroud)

输入为七个字符,每个字符代表一周中的某一天.

如果没有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");
Run Code Online (Sandbox Code Playgroud)

Jon*_*Jon 5

您可以使用内置函数执行第一个版本:

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

$in = "0110001";
echo implode(', ', array_intersect_key($daynames, array_filter(str_split($in))));
Run Code Online (Sandbox Code Playgroud)

这是如何工作的:

  1. 将输入拆分为1和0的数组; 至关重要的是,这个数组的键匹配的键$daynames.
  2. 过滤掉零; 幸运的是array_filter保留了钥匙.
  3. 用于array_intersect_key将键映射到内部值$daynames.
  4. 使用implode做一个逗号分隔的上述清单.

如果你想将最后一个逗号转换为"and",最简洁的方式是正则表达式(我个人觉得这个解决方案有问题,虽然它无可否认有效):

echo preg_replace('/,(?=[^,]+$)/', ' and', implode(...));
Run Code Online (Sandbox Code Playgroud)

然而

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

上述一定的代码并没有落入任一那些类别; 我的专业建议是使用,foreach如果这会产生任何人都熟悉的代码.