首页 > 解决方案 > 每次从数组中依次返回 5 个项目

问题描述

我想从数组中返回前 5 个项目。

一旦返回前 5 个项目,那么如果我重新执行我的函数,那么它可以从同一个数组中返回第二个 5 个项目,依此类推。

我怎样才能做到这一点?

$myArray = [28,32,33,34,37,49,50,52,57,61,62,63,65,66,67,68,70,71,73,74,75,80,81,89];

我需要如下输出

Outputs:-
    first time $ans = [28,32,33,34,37];
    second time $ans = [49,50,52,57,61];
    third time $ans = [62,63,65,66,67];
    fourth time $ans = [68,70,71,73,74];
    fifth time $ans = [75,80,81,89];

标签: phparrayssortingarraylistarray-view

解决方案


我认为上课会有益于这种情况:

<?php

class MyClass {
    
    private $pos = 0;
    
    private $data = [];
    
    function __construct($data) {
        $this->data = $data;
    }
    
    public function next($length = 5) {
        $offset = $this->pos;
        
        $this->pos = $offset + $length;
        
        return array_slice($this->data, $offset, $length);
    }
    
}

示例用法:

$class = new MyClass([28,32,33,34,37,49,50,52,57,61,62,63,65,66,67,68,70,71,73,74,75,80,81,89]);

print_r($class->next());
print_r($class->next());
print_r($class->next());
print_r($class->next(10));

输出:

Array
(
    [0] => 28
    [1] => 32
    [2] => 33
    [3] => 34
    [4] => 37
)
Array
(
    [0] => 49
    [1] => 50
    [2] => 52
    [3] => 57
    [4] => 61
)
Array
(
    [0] => 62
    [1] => 63
    [2] => 65
    [3] => 66
    [4] => 67
)
Array
(
    [0] => 68
    [1] => 70
    [2] => 71
    [3] => 73
    [4] => 74
    [5] => 75
    [6] => 80
    [7] => 81
    [8] => 89
)

更新

下面更新的代码通过序列化对象并将其持久化到本地存储来在脚本执行之间工作。我还更改了脚本检索数据的方式,在下面的示例中,它是从名为“data”的文件中读取的,这使脚本更加动态,因为如果需要,您可以将不同的数据集传递给脚本。

数据(存储在名为“数据”的文件中):

28,32,33,34,37,49,50,52,57,61,62,63,65,66,67,68,70,71,73,74,75,80,81,89

脚本:

class MyClass {

    private $pos = 0;

    private $data = [];

    function __construct($data) {
        $this->data = $data;
    }

    public function next($length = 5) {
        $offset = $this->pos;

        $this->pos = $offset + $length;

        return array_slice($this->data, $offset, $length);
    }

}

if(file_exists('class.ser')) {
    $class = unserialize(file_get_contents('class.ser'));
} else {
    $data = explode(',', file_get_contents('data'));

    $class = new MyClass($data);
}

print_r($class->next());

file_put_contents('class.ser', serialize($class));

脚本的流程如下:

  1. 该脚本检查名为“class.ser”的文件,如果存在,则反序列化文件中包含的对象
  2. 如果对象被反序列化,则只需执行该next()方法
  3. 如果对象未反序列化(因为文件不存在),则通过传入“数据”文件中的数据实例化一个新对象并执行该next()方法
  4. 最后,具有现在更新的属性的对象被序列化并存储回本地存储,为下一次执行做好准备

如果要从数据集的开头重新运行脚本,则需要删除创建的“class.ser”文件。


推荐阅读