可能重复:
Implode array with “, ” and add “and ” before last item
我正在自定义WordPress主题,我在管理员的用户个人资料页面中创建了一些复选框,确切地说是3。当用户检查每个框时,该框的值将在保存其配置文件时保存在数组calle $ targets中。这一切都很有效。
在模板页面上,我根据用户选择的目标对如何显示某些内容进行了一些测试,因此我创建了以下代码,用于检查数组是否包含其中的每个值' s拥有然后将目标组合在一起,然后根据这些选择回显特定内容。它工作得很好,但我觉得代码臃肿,可以简化。这是我一直希望用我的代码做的事情。我非常感谢您对如何使用更少的代码实现相同结果的想法。感谢。
$goals = get_user_meta( $userID, 'goals', $single );
if (in_array('Weight Loss', $goals, true) && !in_array('Improve Fitness', $goals, true) && !in_array('Improve Health', $goals, true)) {
echo 'Weight Loss';
} elseif (in_array('Improve Fitness', $goals, true) && !in_array('Weight Loss', $goals, true) && !in_array('Improve Health', $goals, true)) {
echo 'Improve Fitness';
} elseif (in_array('Improve Health', $goals, true) && !in_array('Improve Fitness', $goals, true) && !in_array('Weight Loss', $goals, true)) {
echo 'Improve Health';
} elseif (in_array('Weight Loss', $goals, true) && in_array('Improve Fitness', $goals, true) && !in_array('Improve Health', $goals, true)) {
echo 'Weight Loss and Improve Fitness';
} elseif (in_array('Weight Loss', $goals, true) && !in_array('Improve Fitness', $goals, true) && in_array('Improve Health', $goals, true)) {
echo 'Weight Loss and Improve Health';
} elseif (!in_array('Weight Loss', $goals, true) && in_array('Improve Fitness', $goals, true) && in_array('Improve Health', $goals, true)) {
echo 'Improve Fitness and Improve Health';
} elseif (in_array('Weight Loss', $goals, true) && in_array('Improve Fitness', $goals, true) && in_array('Improve Health', $goals, true)) {
echo 'Weight Loss, Improve Fitness and Improve Health';
} else {
echo 'Nothing set';
}
答案 0 :(得分:2)
以人类可读的形式表示目标列表:
if (count($goals) > 1) {
echo join(', ', array_slice($goals, 0, -1)) . ' and ' . end($goals);
} elseif ($goals) {
echo $goals[0];
} else {
echo "Nothing set";
}
根据您拥有的项目数量,代码将返回"X"
/ "X and Y"
/ "X, Y and Z"
。
如果有多个项目,则会执行以下操作:
array_slice()
将项目包括在内但不包括最后一项 - 使用join()
并在其中加逗号 - 使用{{3}}。" and "
和最后一项的值。要将$goals
数组缩小到您提到的那些项目:
$goals = array_intersect(array('Weight Loss', 'Improve Fitness', 'Improve Health'), $goals);
除了您感兴趣的值之外,它会删除所有值,在您的情况下只有三个值。根据您的具体情况,您可能不需要此代码。
答案 1 :(得分:0)
如果你不想像你的例子所说的那样简单地连接字符串,那么该代码的简化版本将是这样的:
sort($goals);
switch ($goals) {
case array('Weight Loss') :
...
break;
case array('Improve Fitness', 'Weight Loss') :
...
break;
...
}
这里重要的是两个数组中的元素顺序相同,因此初始sort
和比较元素按字母顺序排序。
话虽如此,除了处理所有可能的排列之外,还有一种更好的处理方式,因为随着您添加更多选项,这会以指数方式上升。你通常应该遍历目标集合,为每个目标做一些事情,然后输出一些聚合值:
$output = array();
foreach ($goals as $goal) {
switch ($goal) {
case 'Weight Loss' :
$output[] = 'I want to lose weight.';
break;
case 'Improve Fitness' :
$output[] = ...
break;
...
}
}
echo join("\n", $output);
有一个非常明智的基于OOP的结构,每个目标被定义为一个单独的对象,这看起来更像是:
$output = array();
foreach ($goals as $goal) {
$output[] = $goal->objectiveDescription();
}
echo join("\n", $output);
换句话说,你接近问题的方式是不够的。在不知道你实际想要做什么的情况下,很难提出一些建议。