问题标签 [spl]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - 为过时对象的集合选择数据结构
我正在尝试设计一个 PHP 对象(称为它Incident_Collection
),它将包含其他对象的集合,每个对象都实现一个Incident
接口。
起初我想我只是制作我的Incident_Collection
实现IteratorAggregate
并将 Incident 对象存储在集合的数组属性中:
但是由于Incident
对象具有自然顺序,我认为扩展其中一个SPL 数据结构可能更合适/更有效。但是哪一个?我不太清楚何时使用特定的数据结构。
另一个问题是Incident_Collection
. 例如,如果有一个具有 的Person
对象,则Incident_Collection
可能会应用以下限制:
- 仅 1
Birth
起事件 - 如果
Birth
存在,它必须是集合中最早的事件 - 仅 1
Death
起事件 - 如果
Death
存在,它必须是集合中的最后一个事件 HS_Graduation
必须紧随其后HS_Begin
Incident_Collection
拥有一个接受其所有者(例如Person
)的一组限制的泛型或子类会更好Person_Incident_Collection
吗?
php - PHP SPL - 是否有任何接口或类来控制转换为数组时会发生什么?
因此,通过实现Iterator
、ArrayAccess
和Countable
内置接口,我们可以控制在foreach
循环中使用对象或访问属性时,对象内部会发生什么,就好像它是数组索引($object['id']
)一样。
例如,如果您愿意,您可以对其进行设置,以便$object['version'] += 1
自动增加version
数据库中的字段。
缺少的是投射object
to array
。是否有任何接口或类可以控制您执行以下操作时发生的情况:(array) $object
?任何内置的接口或类,无论多么晦涩难懂?例如:如果我想(array) $object
返回$this->propertyArray
而不是转储所有公共对象属性的普通对象到数组转换?
注意:像要求$object->toArray()
通过方法名调用这样的东西不算数,因为这个想法是尽可能地减少数组和对象之间的外部差异。
php - SplPriorityQueue 按升序排列
下面显示了 SplPriorityQueue 将最高优先级赋予最大优先级值,在这种情况下,对应于最新日期。
给定任意一组日期作为优先级,如何使 SplPriorityQueue 的内容以升序而不是降序的日期顺序出现?
ETA:我有一种使用 Unix 时间戳的笨拙方式。但这在 Unix 时代之外失败了。
有没有更健壮的方法?
php - 将对象集合限制为唯一集合
目前我有一个名为Collection
. 它使用一个数组来保存一组独特的对象。它们是唯一的,不是因为它们具有不同的内存地址(尽管显然它们确实如此),而是因为集合中没有等效的对象。
我一直在阅读关于SplObjectStorage
哪个比数组具有显着的速度优势并且可能比我的Collection
班级更容易维护的信息。我的问题是它SplObjectStorage
不关心等同性,只关心身份。例如:
所以我一直在考虑如何子类化SplObjectStorage
,这样它attach()
就会受到对象等效性的限制,但到目前为止,它涉及将$data
对象设置为“等效签名”,这似乎需要遍历数据结构,直到我找到(或没有)一个匹配的值。
例如:
有没有更好的办法?
php - 使用 count() 计算实现 ArrayAccess 的对象的元素?
当一个类实现了ArrayAccess
接口时,它就可以作为一个数组使用了,包括 OffsetGet、OffsetSet 等等。
我没有看到的一件事是当我们想要count()
或sizeof()
它时的实现,在我对 PHP 的有限了解中,它相当于相同。
有没有类似的东西已经在标准 PHP 中实现了?
php - 使用 PHP - SPL 解决方案反向遍历数组?
PHP 中是否有 SPL 反向数组迭代器?如果没有,实现它的最佳方法是什么?
我可以简单地做
或者
但是有没有更优雅的方式呢?
php - 什么是 php 中的对象迭代
谁能解释什么是对象迭代以及这段代码是如何工作的?
php - 如何使用 PHP 5.3 序列化 SplFileObject?
我正在尝试序列化一个 SplFileObject,它在 5.2 中静默失败并在 5.3 中引发致命错误。到目前为止,我已经解决了 5.2 中的问题,方法是继承 SplFileObject 并使用(简化)以下代码实现 Serializable 接口(完整版还处理 $open_mode 和 $context 但这与该问题无关):
但 5.3 仍然会抛出致命的:
我也尝试添加魔法__sleep
和__wakeup
方法,但无济于事。
谷歌似乎对此知之甚少,所以我想知道是否有可能在 5.3 中序列化一个 SplFileObject。
更新:似乎那个问题没有答案(参见我的评论)。
php - 如何使用 RecursiveDirectoryIterator 循环引用当前目录名、文件名和文件内容?
在下面的脚本中,我试图遍历 $base 文件夹中的文件夹和文件。我希望它包含单级子文件夹,每个子文件夹都包含许多 .txt 文件(并且没有子文件夹)。
我只需要了解如何在下面的评论中引用元素...
非常感谢任何帮助。我真的很接近结束这个:-)
php - 使用 SPL 的 DirectoryTreeIterator 对每个目录的文件进行排序
我发现了几个与 SPL 迭代器相关的问题(这个和这个问题),但我不确定它们是否对我的情况有帮助,因为我使用的是 ; 的相当高级别的扩展RecursiveIteratorIterator
。DirectoryTreeIterator
. _
有人可以告诉我DirectoryTreeIterator
在迭代器输出后如何更改或如何对每个目录返回的数组进行排序吗?
如果可以使用.htaccess
例如,直接在 Apache 服务器上正确排序文件的方法对我来说也是一种选择。
这是DirectoryTreeIterator
来自 SPL 的代码:
澄清为什么我使用上面的代码是因为它完全符合我的需求。我想生成一个以空格为前缀的递归目录树——Marcus Boerger 的原始代码示例添加了一些 ASCI 元素。问题是我无法控制文件和目录的排序,所以我希望目录树看起来像这样:
相反,迭代器返回的列表根本没有排序,它向我显示了如下内容:
所以我想我正在寻找的解决方案是每次索引子目录并添加到目录树时调用排序方法的某种方式。
我希望我已经把它说得更清楚了,作为一个非母语的人,有时很难将想法变成连贯的句子(甚至是单词)。