有没有办法在内爆数组时添加增量值?
这是我想要增量值的代码:
$entries = '<ul class="repeatData"><li class="listEntry1">' . implode('</li><li class="listEntry'. $countme .'">', $data) . '</li></ul>';
如果可能的话,我想以某种方式使变量$countme
每次内爆每个数组值时都会增加。
您不能使用 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,它将应用于所有数组的元素。
没有内置功能。你必须自己写:
这个函数概括了这个问题,并将一组胶水和数据作为参数。您可以对其进行改进以更适合您的需求...
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;
}
要扩展@ravloony 的答案,您可以使用带有计数器的映射函数来生成您想要的内容,以下函数可以提供帮助。
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>';
您还应该考虑这是否是您真正需要的。在 Javascript 和 CSS 中,如果需要,您可以轻松引用节点的第 n 个子节点。
不,内爆不是那样工作的。您将需要创建自己的函数来执行此操作。