3

有没有办法在内爆数组时添加增量值?

这是我想要增量值的代码:

$entries = '<ul class="repeatData"><li class="listEntry1">' . implode('</li><li class="listEntry'. $countme .'">', $data) . '</li></ul>';

如果可能的话,我想以某种方式使变量$countme每次内爆每个数组值时都会增加。

4

5 回答 5

8

您不能使用 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,它将应用于所有数组的元素。

于 2013-10-21T16:43:20.100 回答
4

没有内置功能。你必须自己写:


这个函数概括了这个问题,并将一组胶水和数据作为参数。您可以对其进行改进以更适合您的需求...

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;
}
于 2013-10-21T16:42:51.020 回答
3

要扩展@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>';
于 2013-10-21T17:05:00.770 回答
2

您还应该考虑这是否是您真正需要的。在 Javascript 和 CSS 中,如果需要,您可以轻松引用节点的第 n 个子节点。

于 2013-10-21T16:45:48.823 回答
2

不,内爆不是那样工作的。您将需要创建自己的函数来执行此操作。

于 2013-10-21T16:41:49.673 回答