PHP:如何将数组分成两部分?

4

我有一个包含数据库记录的数组。它可能拥有大量或很少的元素,而且经常会变化。

我需要将这个数组分成两个相等的部分。原因是我随后会将这些数组传递到 Laravel 视图中,并将它们显示在不同的列中。

这里是被提取的数据库记录:

$books = Book::where('unitcode', '=', $unitcode['unitcode'])->get();

如果提取成功,那么我会运行以下代码:

return View::make('showbooks')
->with('books', $books);

我想要做的是传递$books1$books2,它实际上是将$books分成两部分。

您有什么想法吗?谢谢。


@scrowler,您能否发布有关其使用的答案?我是新手,很难找到数组的长度,然后将其分块。 - KriiV
@scrowler 谢谢!获取另一半是否就像这样简单:$books = array_chunk($books, count($books)/2, count($books); - KriiV
$books 将包含一个数组,其中有两个键,每个键都包含数组的一半。你也可以使用 list($books1, $books2) = array_chunk($books, count($books)/2); 将它们放入变量中。 - scrowler
如果你使用 array_chunk 函数并且元素数量是奇数,它会创建一个包含 3 个数组的数组,而不是每个数组都多一个元素的 2 个数组。 - Ohgodwhy
@Ohgodwhy 你说得对。最好使用 ceil(count($books)/2) 四舍五入避免分数。 - scrowler
显示剩余5条评论
6个回答

23

这是一行简短的内容:

$halved = array_chunk($books, ceil(count($books)/2));

然后$halved[0]将包含数组的前一半。如果数组包含奇数个元素,则该数组始终会比后一半多一个元素。当然,$halved[1]将包含数组的第二半。

这里是一个可运行的示例


1
我认为这对你有用。
<?php
    $books = array("a", "b", "c", "d", "e","f"); // assuming books is an array like this
    $count = count($books); // total count of the array books
    $half = $count/2; // half of the total count
    $books1 = array_slice($books, 0, $half);      // returns first half
    $books2 = array_slice($books, $half);  // returns second half

    print_r($books1);
    print_r($books2);
?>

1
如果 $books 元素数量为奇数,则会有一个元素被省略... 我会移除 $books2 的第二个 $half 参数,这样你就可以从 $books1 结束的地方获取数组的其余部分... - Mark Miller

0

Ohgodwhy的回答进行补充:

既然你正在使用,这里有一种更流畅的方法来实现这个目标:

$books = collect($books);

$halved = $books->split(ceil($books->count()/2))->toArray();

// Result: [[a, b, c], [d, e, f]]

浏览 Laravel 的各种 集合方法,以获取更多可用的方法来流畅地操作数组。


0

splitIn()

splitIn方法将集合分成给定数量的组,在将剩余部分分配给最后一组之前,完全填充非终端组:

$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
 
$groups = $collection->splitIn(3);
 
$groups->all();

// [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10]]

0
我认为你应该使用count方法获取数组的长度,然后循环遍历到中间位置,代码应该像这样:
<?php 
    $count = count($books);            //getting the count of $books
    $mid = round($count/2);           //getting the mid point of $books
    for($i = 0; $i < $count ; $i++){ //looping through the indexes
        if($i <= mid - 1){          //Checking the position of $i and adding the value
            $books1[] = $books[$i];
        }else{
            $books2[] = $books[$i];
        }
    }
?>

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接