在插入数组时有没有办法添加增量值?
这是我想要增加值的代码段:
$entries = '<ul class="repeatData"><li class="listEntry1">' . implode('</li><li class="listEntry'. $countme .'">', $data) . '</li></ul>';
如果可能的话,我想以某种方式使变量$countme
在每次内爆每个数组值时递增。
答案 0 :(得分:7)
你不能用implode做到这一点,但是考虑将匿名函数应用于数组。你可以用更多的代码做你想做的事。
$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和$ counter(实际上它是一个闭包),以便它可以在其作用域内修改它们,并将它传递给array_walk,这将适用它到数组的所有元素。
答案 1 :(得分:3)
没有内置功能。你必须自己编写:
此函数概括了问题,并将一组胶水和数据作为参数。您可以对其进行优化以满足您的需求......
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);
如果您自定义功能,可以保存填充$glues
的for循环:
function custom_implode($start, $pieces) {
$result = '';
$counter = $start;
while($piece = array_shift($pieces)) {
$result .= $piece;
if(!empty($pieces)) {
$result .= '</li><li class="listEntry'. $counter .'">';
}
}
return $result;
}
答案 2 :(得分:2)
要扩展@ravloony's answer,您可以使用带计数器的映射函数来生成您想要的内容,以下函数可以提供帮助。
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
对于你的情况:
$entries = '<ul class="repeatData"><li class="listEntry1">'
. implode_with_counter('</li><li class="listEntry[countme]">', $data, 2, '[countme]')
. '</li></ul>';
更新:替代
另一种方法是只实现implode()
的回调版本,并提供一个函数。这比模式匹配更普遍可用。
function implode_callback($callback, array $array) {
if (!is_callable($callback)) {
throw InvalidArgumentException("Argument 1 must be a callable function.");
}
$str = "";
$cIndex = 0;
foreach ($array as $cKey => $cValue) {
$str .= ($cIndex == 0 ? '' : $callback($cKey, $cValue, $cIndex)) . $cValue;
$cIndex++;
}
return $str;
}
使用示例:
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>';
答案 3 :(得分:1)
不,内爆不会那样。 你需要创建自己的功能才能做到这一点。
答案 4 :(得分:1)
您还应该考虑这是否是您真正需要的。在Javascript和CSS中,如果需要,可以轻松引用节点的第n个子节点。