PHP中无foreach的字符串字符解析
我想用php进行以下转换: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
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不,他的数组中的每一位都代表一周中的一天,他想用他们各自的名字来显示。这就是我一开始的想法。但要避免尾随空格或“,”是很困难的。这是我一开始的想法。但要避免尾随空格或“,”很难。