web-dev-qa-db-ja.com

PHPに辞書はありますか?

例えば:

$names = {[bob:27, billy:43, sam:76]};

そして、次のように参照できるようになります。

 $names[bob]
54
bzupnick

http://php.net/manual/en/language.types.array.php

<?php
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// as of PHP 5.4
$array = [
    "foo" => "bar",
    "bar" => "foo",
];
?>

標準配列はそのように使用できます。

67
Jacob

いいえ、PHPには辞書がありません。最も近いものは配列です。ただし、配列はインデックスとキーの両方を持つという点で、辞書とは異なります。辞書にはキーのみがあり、インデックスはありません。それはどういう意味ですか?

$array = array(
    "foo" => "bar",
    "bar" => "foo"
);

上記の配列では次の行を使用できますが、辞書の場合はエラーになります。

print $array[0]

Pythonには配列と辞書の両方があります。たぶん、あなたはpython背景から来ています

2
Brént Russęll

計量することを許可します、はい、そうです。

また、Phpで使用すると非常に効果的です。

次の問題を考えてみましょう:与えられた文字列にすべての文字が現れる回数を出力する関数を書きます。辞書の使用を簡単にするために、PHPを使用することにしますが、このアプローチはほとんどすべての言語で使用できます。

辞書を使用しないアプローチの1つは次のとおりです。

<?php
$string = "Hello World!";
$split = str_split($string);

getCount($split);

function getCount($split) {
    while(!empty($split)) {
        $count = 1;
        $newArray = array();
        $firstChar = $split[0];
        for($i = 1; $i < count($split); $i++) {
            $element = $split[$i];
            if($element != $firstChar) {
                $newArray[] = $element;
            } else {
                $count++;
            }
        }
        $split = $newArray;
        echo $firstChar . " = " . $count . "\n";
    }
}

ご覧のとおり、このgetCount(…)関数は、配列内の要素とほぼ同じ回数だけ配列内のデータを走査する必要があります。これでタスクは完了しますが、コストは配列のサイズに指数関数的に比例します。辞書でこれを簡単にしましょうか?

<?php
$string = "Hello World!";
$split = str_split($string);

getCountDictionary($split);

function getCountDictionary($split) {
    $dict = [];
    foreach($split as $char) {
        if (!isset($dict[$char])) {
            $dict[$char] = 1;
        } else {
            $dict[$char]++;
        }
    }

    print_r($dict);
}

すばらしい、コードはよりクリーンで効果的です。この新しいアプローチでは、処理中に一度だけ配列を走査します。ディクショナリでのアクセスおよび挿入操作は複雑なO(1)であるためです。

完全な説明: http://www.jazzcoding.com/2019/02/26/why-i-like-dictionaries-so-much/

0
Helen Wood