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()
,因为闭包中使用的闭包非常好,但往往会让人困惑!