PHP以增量值内爆
在内爆数组时,是否有任何方法可以添加增量值 这是我想要的增量值代码:PHP以增量值内爆,php,implode,Php,Implode,在内爆数组时,是否有任何方法可以添加增量值 这是我想要的增量值代码: $entries = '<ul class="repeatData"><li class="listEntry1">' . implode('</li><li class="listEntry'. $countme .'">', $data) . '</li></ul>'; $entries='。内爆(“,$data)。”'; 如果可能的话,我想让变量
$entries = '<ul class="repeatData"><li class="listEntry1">' . implode('</li><li class="listEntry'. $countme .'">', $data) . '</li></ul>';
$entries='- 。内爆(“
- ,$data)。”
';
如果可能的话,我想让变量
$countme
每次内爆每个数组值时都递增。不,内爆不是这样工作的。
您需要创建自己的函数来完成此操作。没有用于此操作的内置函数。你必须自己写:
此函数概括了问题,并将胶水数组和数据作为参数。您可以对其进行优化,使其更适合您的需要
function custom_implode($glues, $pieces) {
$result = '';
while($piece = array_shift($pieces)) {
$result .= $piece;
$glue = array_shift($glues);
if(!empty($pieces)) {
$result .= $glue;
}
}
return $result;
}
用法:
$glues = array();
for($i = 0; $i < $end; $i++) {
$glues []= '</li><li class="listEntry'. $i .'">';
}
echo custom_implode($glues, $data);
您不能使用内爆来实现这一点,但要考虑对数组应用匿名函数。您可能不需要太多的代码就可以做您想做的事情
$entries = '<ul class="repeatData">';
$countme = 1;
array_walk($data, function ($element) use (&$entries, &$countme) {
$entries .= '<li class="listEntry'. $countme .'">'. $element . '</li>';
$countme++;
});
$entries .= "</ul>";
$entries=';
$countme=1;
数组($data,函数($element)使用(&$entries,&$countme){
$entries.='- .$element.'
';
$countme++;
});
$entries.=“
”;
解释:我已经编写了一个匿名函数,告诉了它$$项和$计数器(实际上是一个闭包),以便它可以在其范围内修改它们,并将其传递给AARYAYFACKER,它将应用到数组的所有元素。
你也应该考虑这是否是你真正需要的。在Javascript和CSS中,如果需要,您可以很容易地引用节点的第n个子节点。
要进一步扩展,您可以使用带有计数器的映射函数来生成所需内容,以下函数可以提供帮助function implode_with_counter($glue, $array, $start, $pattern) {
$count = $start;
$str = "";
array_walk($array, function($value) use ($glue, $pattern, &$str, &$count) {
if (empty($str)) {
$str = $value;
} else {
$str = $str . preg_replace('/' . preg_quote($pattern, '/') . '/', $count, $glue) . $value;
$count++;
}
});
return $str;
}
示例用法:
echo implode_with_counter(' ([count]) ', range(1,5), 1, '[count]');
// Output: 1 (1) 2 (2) 3 (3) 4 (4) 5
echo implode_callback(function($cKey, $cValue, $cIndex) {
return ' (' . $cIndex . ') ';
}, range(1,5));
// Output: 1 (1) 2 (2) 3 (3) 4 (4) 5
对于您的情况:
$entries = '<ul class="repeatData"><li class="listEntry1">'
. implode_with_counter('</li><li class="listEntry[countme]">', $data, 2, '[countme]')
. '</li></ul>';
示例用法:
echo implode_with_counter(' ([count]) ', range(1,5), 1, '[count]');
// Output: 1 (1) 2 (2) 3 (3) 4 (4) 5
echo implode_callback(function($cKey, $cValue, $cIndex) {
return ' (' . $cIndex . ') ';
}, range(1,5));
// Output: 1 (1) 2 (2) 3 (3) 4 (4) 5
你的情况:
$entries = '<ul class="repeatData"><li class="listEntry1">'
. implode_callback(function($cKey, $cValue, $cIndex) {
return '</li><li class="listEntry' . ($cIndex + 1) . '">';
}, $data)
. '</li></ul>';
$entries='- '
. 内爆回调(函数($cKey、$cValue、$cIndex){
返回“
- ;
},$data)
. '
';
$countme=$countme+1@萨米莎不工作。我试过了。我将尝试这个函数,因为它是我问题的唯一完整建议。内爆
的目的不是要跳过自己编写循环的冗长内容吗?虽然这是问题的字面解决方案,但它需要写出两个循环(一个在函数def中,另一个用于构建胶水)并增加额外的复杂性。@grossvogel我已经提到了这一点。这个函数更一般。。可以为OP添加一个特殊的功能(以便让他只需复制粘贴代码而无需使用大脑;)而不是在这种情况下。我正在处理的容器和选择器的数量是动态的,并不是在每种情况下都有效。是的,for循环是一个更快的答案,但是闭包更有趣,并且是一种比html列表更容易处理的问题的好技术。我是未来证明的OP!他希望将数组的元素加入到一个html列表中。这就是我所做的。我不明白问题是什么。我知道内爆()的作用。很抱歉,你是对的,代码是正确的,可以完成工作。我看了太多关于array\u map
的返回值,而不是闭包的&entries
参数。我明白了!array_walk会比array_map更准确。太完美了!这正是我想要的。这是一个有趣的。我正在考虑一个类似的答案,使用它可以为阵列内容和计数器分别提供模式中的%s
和%d
。@grossvogel:这肯定会比较便宜,在每次内爆时使用正则表达式替换是相当昂贵的。提供一个简单的内爆回调()
函数可能会更有效率。我将添加一个。@grossvogel:在回调示例中,将其切换为使用foreach
循环,而不是array\u walk()
,因为闭包中使用的闭包非常好,但往往会让人困惑!