PHP 中 FIFO/LIFO 的简单实现。

1.0.2 2018-12-14 11:59 UTC

This package is auto-updated.

Last update: 2024-09-29 05:02:17 UTC


README

这是一个简单的包,可以帮助您设置和处理后进先出(LIFO)和先进后出(FIFO)场景。

第一步

~/your_projects/folder> composer require brekitomasson/kew

第二步

$foo = new BrekiTomasson\Kew\Kew();
$foo->add('red');
$foo->add('blue');
$foo->add('green);
$foo->next();
> 'red'
$foo->next();
> 'red'
$foo->get();
> 'red'
$foo->get();
> 'green'
$foo->size();
> 1
$foo->add('yellow');
$foo->size();
> 2
$foo->next();
> 'blue'
$foo->last();
> 'yellow'
$foo->get();
'yellow'

描述 & 语法

注意:我在本文档中多次使用“列表”一词。在大多数情况下,这仅仅意味着 Kew 对象的一个实例。然而,由于 Kew 既可以作为队列使用,也可以作为栈使用,因此我使用更通用的“列表”一词来指代两者。

总的来说,这是一个非常简单的包。只需将一个新的 Kew 对象(是的,发音像“queue”。我知道,非常聪明...)实例化到变量中,您将拥有以下方法可供使用

  • add() - 将一个或多个项目按您列出的顺序添加到列表中。
  • push() - "add()" 的别名。
  • get() - 从列表中获取下一个项目,并将其从列表中删除。
  • pop() - "get()" 的别名。
  • next() - 显示列表中的下一个值,而不删除它。
  • top() - "next()" 的别名。
  • last() - 显示当前列表中的最后一个值。
  • bottom() - "last()" 的别名。
  • size() - 返回列表中的项目数量。
  • isEmpty() - 根据 size() 是否为 0 返回 true/false。

或者,以不同的方式可视化它

  • 创造性的:add() / push()
  • 破坏性的:get() / pop()
  • 非破坏性的:next() / top()last() / bottom()
  • 状态:size()isEmpty()

哲学 & 局限性

  • 您能访问的只有列表上的第一个和最后一个项目。
  • 您只能将新值添加到列表的末尾。
  • 您只能从列表的开头删除值。
  • 您一次只能从列表中删除一个值。
  • 您不能在创建时将项目添加到列表中,所有列表都是创建时为空的。
  • 您可以查看列表的大小,但不能查看其内容(当然,除了列表中的第一个和最后一个项目外)。
  • 列表中的值必须是同一类型,这由添加到列表中的第一个项目确定。(有关此规则的例外,请参阅选项)

选项

尽管列表是一个相当直接的数据类型,但在构建列表时(仅限于构建时)您可以更改一些事情。要设置这些值之一,请在构建列表时传递包含一个或多个这些值的关联数组

  • typed - 布尔值(默认 true)。根据添加到列表中的第一个项目强制类型锁定。在这里传递 false 将允许您将不同类型的项添加到列表中。
  • nextable - 布尔值(默认 true)。允许您对列表执行“next()”,从而在不删除它的情况下获取下一个项目。在这里传递 false 将禁用 next() 方法。
  • lastable - 布尔值(默认 true)。允许您对列表执行“last()”,从而在不删除它的情况下获取最后一个项目。在这里传递 false 将禁用 next() 方法。
  • sizeable - 布尔型(默认 true)。允许您使用 size() 获取列表的大小。在这里传递 false 将不再允许您查看列表的大小。
  • stack - 布尔型(默认 false)。传递 true 将反转处理顺序,将列表从 先入先出 转换为 后入先出
  • readable - 布尔型(默认 true)。是 nextablelastablesizeable 的组合。在这里传递 false 相当于为这三个都传递 false,这将限制您只能进行 addget 操作。

示例,即“栈和队列”

想象以下两种场景

示例 1 - 队列

您正在构建一个应用,用于在用户将图片发布到在线服务之前自动处理和美化图片。不幸的是,尽管网络速度很快,人们可以在一分钟内上传数百张图片,但处理每张图片大约需要一分钟。您不想让所有图片都处理完毕后才提供给用户,而是希望在处理完每张图片后立即提供给用户。

请使用 Kew!为了实现这一点,您可以这样做

  • 您认为由于您可用的 CPU/RAM 限制,一次只能有十个活动的工作进程,因此您设置了一个 isBusy() 方法,当有十个可用的活动处理会话时返回 true
  • 然后,您将所有调用 startProcessing($image) 方法的代码重构,改为调用 addToProcessingQueue($image) 方法。它所做的只是将其自己的 Kew 对象 add()
  • 然后,您将处理工作重构,不再从外部方法调用。而是按照时间表运行,每秒触发一次,调用类似
if ($this->isBusy()) {
    return false;
} else {
  if ($this->kewObject->isEmpty()) {
      return false;
  } else {
      $this->startProcessing($this->kewObject->get());
  }
}

... 或者更简单地说

if (!$this->isBusy() && !$this->kewObject->isEmpty()) {
    $this->startProcessing($this->kewObject->get());
}

示例 2 - 栈

您正在通过允许人们浏览其他用户发布的图片来扩展您图片处理工具的社会功能。当然,很容易导航到新用户或新图片,但您需要某种方式让用户能够在导航历史中回退...

请使用 Kew!每次用户开始一个会话时,都会为他们分配一个新的 Kew 对象,实例化时带有选项 ['stack' => true]。每次他们点击应用程序中的另一个页面时,当前页面(他们要离开的页面,而不是他们要导航到的页面)都会被 add() 到栈中。然后,如果他们需要回退,只需从栈中 get() 即可。如果他们想继续回退,只需继续从栈中 get(),直到他们到达想要的位置。

待办事项 / 未来开发

  • 实现栈功能。
  • 实现一个“最大大小”功能(默认关闭)并具有以下选项
  • 如果达到最大大小,返回异常。
  • 如果达到最大大小,从队列/栈中移除项目。