在数组中每10个后添加另一个项目

时间:2012-12-16 11:53:16

标签: php

我有一个数组

$names = array( "Ayush" , "Vaibhav", "Shivam", "Hacker", "Topper",
                "ABCD",  "NameR", "Tammi", "Colgate", "Britney",
                "Bra", "Kisser");

我有另一个变量

$addthis = "ADDTHIS";

如何从这两个数组中创建数组,以便在$names中的每三个项目之后添加$addthis的值。所以,我希望这个数组来自这两个。

$result = array( "Ayush" , "Vaibhav", "Shivam", "ADDTHIS", "Hacker",
                 "Topper", "ABCD", "ADDTHIS",  "NameR", "Tammi",
                 "Colgate", "ADDTHIS", "Britney", "Bra", "Kisser");

请提供正确的密码。任何帮助将不胜感激。

7 个答案:

答案 0 :(得分:4)

“Oneliner”,只是为了好玩:

$new = array_reduce(
    array_map(
        function($i) use($addthis) { return count($i) == 3 ? array_merge($i, array($addthis)) : $i; },
        array_chunk($names, 3)
    ),
    function($r, $i) { return array_merge($r, $i); },
    array()
);

答案 1 :(得分:1)

另一个oneliner;)

$result = call_user_func_array(
    'array_merge', array_map(function($v) use ($addthis) {
        return $v + [4 => $addthis];
    }, array_chunk($names, 3))
); array_pop($result);

Demo

答案 2 :(得分:0)

也许是一个更容易理解的解决方案:

// the parameters
$names = array( "Ayush" , "Vaibhav", "Shivam", "Hacker", "Topper",
            "ABCD",  "NameR", "Tammi", "Colgate", "Britney",
            "Bra", "Kisser");
$addThis = 'ADDTHIS';
$every = 3;

// how often we need to add this
$count = ceil(count($names) / $every) - 1;
for ($i = 0; $i < $count; $i++) {
    array_splice($names, $i * ($every + 1) + $every, 0, $addThis);
}

array_splice恰好用于修改数组(删除或添加项目),保留现有键并且不对该数组执行任何其他操作。

虽然其他答案也肯定有效,但这应该是最快,最干净的解决方案。

答案 3 :(得分:0)

我对任何好奇的人都有答案,我刚刚完成了使数组随机化的功能。

function randomize($array){
    $randomized=array(); //start a new array
    foreach ($array as $key=>$val){ ///loop thru the array we randomize
        if($key % 2 == 0){   ////if the key is even
            array_push($randomized,$val);///push to back
        }else{ ////if the key is odd
            array_unshift($randomized,$val); ///push to front
        }
    }
    return $randomized;
}///randomize

基本上我们正在做的是创建一个新的随机数组,遍历我们通过的数组,跟踪一个插入器,并在遍历键是否为偶数的情况下将数组值发送回后面,如果它的奇数则发送给我们到前面。

答案 4 :(得分:-1)

$result = array();
$cnt = 0;
foreach ($names AS $val) {
    $result[] = $val;
    if ($cnt >=3) {
        $result[] = $addthis;
        $cnt = 0;
    }
    $cnt++;
}

答案 5 :(得分:-1)

循环并使用modulo检查3.元素: 之后使用splice在两个元素之间插入一个元素

    foreach($result as $k=>$value){
 if(($k+1)%3==0){
   array_splice($arrayvariable, $k+1, 0, "ADDTHIS");
 }
}

答案 6 :(得分:-2)

想要做的一件事是假设数组中的每个键都是数字,并且它准确地表示每个元素的偏移量。这是错误的,因为PHP数组不像传统数组。数组键不是元素的偏移量(,即它不确定元素的顺序),它不必是数字。

不幸的是,PHP数组是有序的哈希映射,而不是传统的数组,因此在地图中间插入新元素的唯一方法是创建一个全新的地图。

您可以使用PHP的array_chunk()函数执行此操作,该函数将创建一个新的元素数组,每个元素包含最多指定数量的元素,形成您的输入数组。因此,我们创建了一个数组数组或 chunks 元素。通过这种方式,您可以遍历块并将它们附加到新阵列,从而获得所需的效果。

$names = array( "Ayush" , "Vaibhav", "Shivam", "Hacker", "Topper",
                "ABCD",  "NameR", "Tammi", "Colgate", "Britney",
                "Bra", "Kisser");

$addthis = "ADDTHIS";

$result = array();

foreach (array_chunk($names, 3) as $chunk) { // iterate over each chunk
    foreach ($chunk as $element) {
        $result[] = $element;
    }
    // Now push your extra element at the end of the 3 elements' set
    $result[] = $addthis;
}

如果你想保留钥匙,你也可以这样做....

$names = array( "Ayush" , "Vaibhav", "Shivam", "Hacker", "Topper",
                "ABCD",  "NameR", "Tammi", "Colgate", "Britney",
                "Bra", "Kisser");

$addthis = "ADDTHIS";

$result = array();

foreach (array_chunk($names, 3, true) as $chunk) { // iterate over each chunk
    foreach ($chunk as $key => $element) {
        $result[$key] = $element;
    }
    // Now push your extra element at the end of the 3 elements' set
    $result[] = $addthis;
}

这既支持元素的顺序,也支持每个元素的。但是,如果您不关心键,则可以使用第一个示例。请注意,按顺序使用数字键会导致第二种方法出现问题,因为此示例中的附加元素假设下一个可用的数字键(因此在下一次迭代时会被覆盖)。