5

我有一个数组

$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");

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

4

7 回答 7

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()
);
于 2012-12-16T12:00:48.787 回答
1

另一个单线;)

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

演示

于 2012-12-16T12:06:30.660 回答
1

对于任何好奇的人,我都有答案,我刚刚完成了一个随机化数组的函数。

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

基本上我们正在做的是创建一个新的随机数组,循环遍历我们传递的数组,跟踪一个交互器,并且当我们循环遍历时,如果键是偶数,我们将该数组值发送到后面,如果它是奇数,我们将它发送到前面.

于 2020-05-13T22:52:50.573 回答
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恰好用于修改数组(删除或添加项目),保留现有键并且不对数组执行任何其他操作。

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

于 2018-10-15T06:26:31.810 回答
-1
$result = array();
$cnt = 0;
foreach ($names AS $val) {
    $result[] = $val;
    if ($cnt >=3) {
        $result[] = $addthis;
        $cnt = 0;
    }
    $cnt++;
}
于 2012-12-16T11:57:43.327 回答
-1

循环并使用模数来检查 3. 元素:之后使用拼接在两个元素之间插入一个元素

    foreach($result as $k=>$value){
 if(($k+1)%3==0){
   array_splice($arrayvariable, $k+1, 0, "ADDTHIS");
 }
}
于 2012-12-16T11:58:21.600 回答
-2

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

不幸的是,PHP 数组是有序的 hashmap,而不是传统的数组,所以在 map 中间插入新元素的唯一方法是创建一个全新的 map。

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

$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;
}

这保留了元素的顺序以及每个元素的键。但是,如果您不关心密钥,则可以简单地使用第一个示例。请注意,按顺序排列的数字键会导致第二种方法出现问题,因为此示例中的附加元素假定下一个可用的数字键(因此在下一次迭代中被覆盖)。

于 2012-12-16T12:19:29.110 回答