PHP 配列・イテレータ ドキュメント

## このページについて

配列やイテレータに関するインターフェースのドキュメントリンク集です。

PHP マニュアル > 関数リファレンス
https://www.php.net/manual/ja/funcref.php

PHP マニュアル > 関数リファレンス > その他の基本モジュール > JavaScript Object Notation
https://www.php.net/manual/ja/book.json.php

PHP マニュアル > 関数リファレンス > その他の基本モジュール > Standard PHP Library (SPL) 
https://www.php.net/manual/ja/book.spl.php

PHP マニュアル > 言語リファレンス
https://www.php.net/manual/ja/langref.php

## 配列

### ArrayAccess インターフェイス

https://www.php.net/manual/ja/class.arrayaccess.php

> 配列としてオブジェクトにアクセスするための機能のインターフェイスです。

### ArrayObject クラス

https://www.php.net/manual/ja/class.arrayobject.php

> このクラスは、オブジェクトを配列として動作させます。

### Countable インターフェイス

https://www.php.net/manual/ja/class.countable.php

> Countable を実装したクラスは、 count() 関数で使用することができます。

### ジェネレータ

https://www.php.net/manual/ja/language.generators.syntax.php

> ジェネレータ関数の見た目はふつうの関数とほぼ同じです。違うのは、値を返すのではなく、 必要なだけ値を yield することです。
> 
> ジェネレータ関数が呼ばれると、反復処理が可能なオブジェクトを返します。 このオブジェクトを (foreach ループなどで) 反復させると、 値が必要になるたびに PHP がジェネレータ関数を呼びます。 そして、ジェネレータが値を yield した時点の状態を保存しておき、 次に値が必要になったときにはそこから再開できるようにします。
> 
> yield できる値がなくなると、ジェネレータ関数は何もせず単純に終了します。 呼び出し元のコードでは、配列の要素をすべて処理し終えた後のように、そのまま処理が続きます。

## イテレータ

### Iterator インターフェイス

https://www.php.net/manual/ja/class.iterator.php

> 外部のイテレータあるいはオブジェクト自身から反復処理を行うためのインターフェイスです。

### IteratorAggregate インターフェイス

https://www.php.net/manual/ja/class.iteratoraggregate.php

> 外部イテレータを作成するためのインターフェイスです。

### OuterIterator インターフェイス

https://www.php.net/manual/ja/class.outeriterator.php

> OuterIterator を実装したクラスは、 イテレータ群の反復処理に使うことができます。

### RecursiveIterator インターフェイス

https://www.php.net/manual/ja/class.recursiveiterator.php

> RecursiveIterator を実装したクラスは、 イテレータ群を再帰的に反復処理するときに使うことができます。

### SeekableIterator インターフェイス

https://www.php.net/manual/ja/class.seekableiterator.php

> Seekable イテレータです。

### SPL イテレータ

https://www.php.net/manual/ja/spl.iterators.php

> SPL にはイテレータが用意されており、オブジェクトを反復処理することができます。

SPL イテレータクラスツリー

```
ArrayIterator
    RecursiveArrayIterator

EmptyIterator
IteratorIterator
    AppendIterator
    CachingIterator
        RecursiveCachingIterator
    FilterIterator
        CallbackFilterIterator
            RecursiveCallbackFilterIterator
        RecursiveFilterIterator
            ParentIterator
        RegexIterator
            RecursiveRegexIterator

    InfiniteIterator
    LimitIterator
    NoRewindIterator

MultipleIterator
RecursiveIteratorIterator
    RecursiveTreeIterator

DirectoryIterator (extends SplFileInfo)
    FilesystemIterator
        GlobIterator
        RecursiveDirectoryIterator
```

## データ構造

https://www.php.net/manual/ja/spl.datastructures.php

> SPL では、標準的なデータ構造を提供しています。 ここで、それらを実装ごとに分類してまとめます。

### 双方向リンクリスト

https://www.php.net/manual/ja/class.spldoublylinkedlist.php

> 双方向リンクリスト (Doubly Linked List: DLL) は、双方向のノードへのリンクを持つノードのリストです。 イテレータの操作、両隣へのアクセス、ノードの追加や削除のコストは、 データ構造が DLL の場合は O(1) となります。 これは、スタックやキューを実装するのに適しています。

```
SplDoublyLinkedList
    SplStack
    SplQueue
```

### ヒープ

https://www.php.net/manual/ja/class.splheap.php
https://www.php.net/manual/ja/class.splpriorityqueue.php

> ヒープは、ツリー風の構造です。ヒープ特有の性質として、 個々のノードはその子ノードと等しいかそれより大きな値となります。 値の比較は、ヒープ全体の比較メソッドとして実装されているものを使用します。

```
SplHeap
    SplMaxHeap
    SplMinHeap

SplPriorityQueue
```

### 配列

https://www.php.net/manual/ja/class.splfixedarray.php

> 配列は、データを連続的に格納してインデックス経由でアクセスできるようにした構造です。 PHP の配列と混同しないようにしましょう。PHP の配列は、 実際のところは順序つきハッシュテーブルとして実装されています。

```
SplFixedArray
```

### マップ

https://www.php.net/manual/ja/spl.datastructures.php

> マップは、キー/値 のペアからなるデータ構造です。 PHP の配列は、整数値/文字列を値と対応させたマップとみなすことができます。 SPL では、オブジェクトとデータを対応させるマップを提供しています。 このマップは、オブジェクトの集合として扱うことができます。

```
SplObjectStorage
```

## Observer パターン

### SplObserver インターフェイス

https://www.php.net/manual/ja/class.splobserver.php

> SplObserver インターフェイスを SplSubject とともに使うと、Observer パターンを実装することができます。

### SplSubject インターフェイス

https://www.php.net/manual/ja/class.splsubject.php

> SplSubject インターフェイスを SplObserver とともに使うと、Observer パターンを実装することができます。

## SPL 関数

https://www.php.net/manual/ja/ref.spl.php

### iterator_apply

https://www.php.net/manual/ja/function.iterator-apply.php

> ユーザー関数をイテレータのすべての要素でコールする

### iterator_count

https://www.php.net/manual/ja/function.iterator-count.php

> イテレータにある要素をカウントする

### iterator_to_array

https://www.php.net/manual/ja/function.iterator-to-array.php

> イテレータを配列にコピーする

## データ保存関連

### Serializable インターフェイス

https://www.php.net/manual/ja/class.serializable.php


> 独自のシリアライズ用のインターフェイスです。
> 
> このインターフェイスを実装したクラスは __sleep() や __wakeup() をサポートしなくなります。 シリアライズが必要な場合には、自動的に serialize メソッドがコールされます。 このメソッドは __destruct() を実行しません。また、 メソッド内で明示的に書かない限りは一切の副作用を及ぼしません。 アンシリアライズされるときにはそのクラスが自動的に検知し、__construct() メソッドのかわりに適切な unserialize() メソッドがコールされます。 標準のコンストラクタを実行させたい場合は、unserialize() メソッドの中でそれをコールします。


### JsonSerializable インターフェイス

https://www.php.net/manual/ja/class.jsonserializable.php

>JsonSerializable を実装したオブジェクトは、 json_encode() を呼んで処理されたときの自身の JSON 表現をカスタマイズできます。

## あまり意識することのないクラス

### Generator クラス

https://www.php.net/manual/ja/class.generator.php

> Generator は ジェネレータ が返すオブジェクトです。

### Closure クラス

https://www.php.net/manual/ja/class.closure.php

> 無名関数 を表すために使うクラスです。