Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中无foreach的字符串字符解析_Php_String_Parsing - Fatal编程技术网

PHP中无foreach的字符串字符解析

PHP中无foreach的字符串字符解析,php,string,parsing,Php,String,Parsing,我想用php进行以下转换: from: "0110001" to: "Tuesdays, Wednesdays, Sundays". 完成此操作的奖励积分: from: "0110001" to: "Tuesdays, Wednesdays and Sundays". 输入为七个字符,每个字符表示一周中的一天 没有foreach循环,我怎么能做到这一点?我想使用array\u walk或array\u reduce 工作解决方案,但带有foreach: <?php funct

我想用php进行以下转换:

from: "0110001" to: "Tuesdays, Wednesdays, Sundays".
完成此操作的奖励积分:

from: "0110001" to: "Tuesdays, Wednesdays and Sundays".
输入为七个字符,每个字符表示一周中的一天

没有foreach循环,我怎么能做到这一点?我想使用array\u walk或array\u 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");

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

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

$in = "0110001";
echo implode(', ', array_intersect_key($daynames, array_filter(str_split($in))));
工作原理:

将输入拆分为1和0的数组;关键是,此数组的键与$daynames的键匹配。 过滤掉零;幸运的是,array_filter保留了密钥。 使用array_intersect_key将键映射到$daynames内的值。 使用“内爆”生成上述内容的逗号分隔列表。 如果您想将最后一个逗号转换为和,最简洁的方法是使用正则表达式。我个人认为这个解决方案值得怀疑,尽管它确实有效:

echo preg_replace('/,(?=[^,]+$)/', ' and', implode(...));
然而 请不要忘记,最好的代码是不存在保证零bug的代码!,其次是闭上眼睛就能理解的代码


上述准则当然不属于上述任何一类;我的专业建议是使用foreach,如果这会产生任何维护它的人都熟悉的代码。

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

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

$in = "0110001";
echo implode(', ', array_intersect_key($daynames, array_filter(str_split($in))));
工作原理:

将输入拆分为1和0的数组;关键是,此数组的键与$daynames的键匹配。 过滤掉零;幸运的是,array_filter保留了密钥。 使用array_intersect_key将键映射到$daynames内的值。 使用“内爆”生成上述内容的逗号分隔列表。 如果您想将最后一个逗号转换为和,最简洁的方法是使用正则表达式。我个人认为这个解决方案值得怀疑,尽管它确实有效:

echo preg_replace('/,(?=[^,]+$)/', ' and', implode(...));
然而 请不要忘记,最好的代码是不存在保证零bug的代码!,其次是闭上眼睛就能理解的代码


上述准则当然不属于上述任何一类;我的专业建议是使用foreach,如果这会产生任何维护它的人都熟悉的代码。

这应该满足您的需要

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);
}

这应该做你需要它做的事情

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);
}

请看。@pinouchon所以你想用and替换最后一个?写一个函数来进行这个转换,你说,你已经有了它,并将该函数作为回调传递给数组_map@pinouchon当前位置无论如何都要发布它。展示你所拥有的将使人们更好地理解这个问题。@HamZaDzCyberDeV不,他的数组中的每一位代表一周中的一天,他想用他们各自的名字来显示。请看。@pinouchon所以你想用and替换最后一个?写一个函数来进行这个转换,你说,你已经有了它,并将该函数作为回调传递给数组_map@pinouchon当前位置无论如何都要发布它。展示你所拥有的将使人们更好地理解这个问题。@HamZaDzCyberDeV不,他的数组中的每一位都代表一周中的一天,他想用他们各自的名字来显示。这就是我一开始的想法。但要避免尾随空格或“,”是很困难的。这是我一开始的想法。但要避免尾随空格或“,”很难。