コンテンツにスキップ

データ構造@PHP

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. データ構造の実装方法

ハードウェアが処理を行う時に、データの集合を効率的に扱うためのデータ格納形式をデータ構造という。

データ構造のPHPによる実装方法を以下に示す。

配列型

同じデータ型のデータを並べたデータ格納様式のこと。

▼ インデックス配列

番号キーごとに値が格納された配列型のこと。

Array
(
  [0] => A
  [1] => B
  [2] => C
)

▼ 多次元配列

配列の中に配列を持つ配列型のこと。

配列の入れ子構造が2段の場合、『二次元配列』と呼ぶ。

(
  [0] => Array
         (
            [0] => リンゴ
            [1] => イチゴ
            [2] => トマト
         )

  [1] => Array
         (
            [0] => メロン
            [1] => キュウリ
            [2] => ピーマン
         )
)

▼ 連想配列

キー名 (赤、緑、黄、果物、野菜) ごとに値が格納された配列型のこと。

下の例は、二次元配列かつ連想配列である。

Array
(
    [] => Array
        (
            [果物] => リンゴ
            [果物] => イチゴ
            [野菜] => トマト
        )

    [] => Array
        (
            [果物] => メロン
            [野菜] => キュウリ
            [野菜] => ピーマン
        )
)


LinkedList型

PHPで使用することは個人的にはないデータ格納様式。

詳しくは、JavaにおけるLinkedList型を参考にせよ。

▼ PHPのlistメソッドとは何なのか

PHPのlistメソッドは、List型とは意味合いが異なる。

配列の個々の要素を変数に格納したい場合、List型を使わなければ、冗長ではあるが、以下の様に実装する必要がある。

*実装例*

<?php

$array = array("あ", "い", "う");
$a = $array[0];
$i = $array[1];
$u = $array[2];

echo $a.$i.$u; // あいう

しかし、以下の様に、listメソッドを使用することによって、複数の変数への格納を1行で実装できる。

*実装例*

<?php

list($a, $i, $u) = array("あ", "い", "う");

echo $a.$i.$u; // あいう


キュー型

Queue1

矢印_80x82

Queue2

矢印_80x82

Queue3

PHPでは、array_pushメソッドとarray_shiftメソッドを組み合わせることにより、実装できる。

*実装例*

<?php
$array = array("Blue", "Green");

// 引数を、配列の最後に、要素として追加する。
array_push($array, "Red");
print_r($array);

// 出力結果

//  Array
//  (
//      [0] => Blue
//      [1] => Green
//      [2] => Red
//  )

// 配列の最初の要素を取り出す。
$theFirst= array_shift($array);
print_r($array);

// 出力結果

//  Array
//  (
//    [0] => Green
//    [1] => Red
//  )

// 取り出された値の確認
echo $theFirst; // Blue

▼ メッセージキュー

送信側の好きなタイミングでファイル (メッセージ) をメッセージキューに追加できる。

また、受信側の好きなタイミングでメッセージを取り出せる。

メッセージキュー


Stack型

PHPでは、array_pushメソッドとarray_popメソッドで実装可能。

Stack1

矢印_80x82

Stack2

矢印_80x82

Stack3


Tree型

▼ 二分探索木

各ノードにデータが格納されている。

二分探索木

▼ ヒープ

プライオリティキューを実現する時に使用される。

各ノードにデータが格納されている。

ヒープ1

矢印_80x82

ヒープ1

矢印_80x82

ヒープ2

矢印_80x82

.


01-02. Javaにおけるデータ構造の実装方法

データ構造のJavaによる実装方法を以下に示す。

配列型

▼ ArrayList

ArrayListクラスによって実装される配列型。

PHPのインデックス配列に相当する。

▼ HashMap

HashMapクラスによって実装される配列型。

PHPの連想配列に相当する。


連結リスト型

値をポインタによって順序通り並べたデータ格納形式のこと。

▼ 単方向リスト

p555-1

▼ 双方向リスト

p555-2

▼ 循環リスト

p555-3


キュー型


スタック型


ツリー型


02. プリミティブデータ型

プリミティブ型

▼ プリミティブ型とは

スカラー型、複合型、その他、に分類できる。

以下のリンクを参考にせよ。


スカラー型

▼ bool

T/F データの種類 説明
FALSE $var = 何も格納されていない変数
False 文字としてのFalse
0 数字、文字列
"" 空文字
array() 要素数が0個の配列
NULL NULL値
TRUE 上記以外の値

▼ float

▼ int

▼ string


複合型

▼ array

▼ callable

▼ iterable

▼ object

<?php

class A
{
    private $name = "Hiroki";

    public function HelloWorld()
    {
        return sprintf(
            "%s, %s",
            $this->name,
            "Hello World!"
            );
    }
}

$a = new A;

var_dump($a);

// object(A)#1 (1) {
//  ["name":"A":private]=>
//  string(6) "Hiroki"
//}

print_r($a);

// A Object
// (
//     [name:A:private] => Hiroki
// )


その他のデータ型

▼ date

厳密にはデータ型ではないが、便宜上、データ型とする。

タイムスタンプとは、協定世界時(UTC)を基準にした1970年1月1日の0時0分0秒からの経過秒数を表したもの。

フォーマット 実装方法 備考
日付 2019-07-07 区切り記号なし、ドット、スラッシュなども可能
時間 19:07:07 区切り記号なし、も可能
日付と時間 2019-07-07 19:07:07 同上
タイムスタンプ (秒) 1562494027 1970年1月1日の0時0分0秒から2019-07-07 19:07:07 までの経過秒数

▼ null

▼ resource


02-02. データ型の判定/変換

判定関数

is_scalar

スカラー型 (bool、float、int、string) を判定する。


キャスト演算子

(string)

<?php

$var = 10; // $varはinteger型。

// キャスト演算子でデータ型を変換
$var = (string) $var; // $varはstring型

(int)

<?php

$var = 1;

// integer型
$var = (int) $var;

// 1

(bool)

<?php

$var = 1;

// boolean型
$var = (bool) $var;

// true

(float)

<?php

$var = "1.0";

// Float型
$var = (float) $var;

// 1.0

(array)

<?php

// 配列型
$var = (array) $var;

(object)

<?php

// Object型
$var = (object) $var;