PHP以增量值内爆

时间:2013-10-21 16:35:59

标签: php implode

在插入数组时有没有办法添加增量值?

这是我想要增加值的代码段:

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

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

5 个答案:

答案 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个子节点。