PHP配列キーで使用できる文字は?


86

奇妙な文字がたくさん入力されているphp配列キーがいくつかあります。

これは許可されていますか?使用できないものに制約はありますか?


制約:$a = (object) ['@km³' => 123]; error_log($a->@km³);
Bitterblue

回答:


90

マニュアルによると:

キーは整数または文字列のいずれかです。値は任意のタイプにすることができます。

さらに、次のキーキャストが発生します。

  • 有効な整数を含む文字列は、整数型にキャストされます。たとえば、キー「8」は実際には8の下に格納されます。一方、「08」は有効な10進整数ではないため、キャストされません。
  • フロートも整数にキャストされます。これは、小数部分が切り捨てられることを意味します。たとえば、キー8.7は実際には8の下に保存されます。
  • ブールも整数にキャストされます。つまり、キーtrueは実際には1の下に格納され、キーfalseは0の下に格納されます。
  • nullは空の文字列にキャストされます。つまり、キーnullは実際には ""の下に格納されます。
  • 配列とオブジェクトをキーとして使用することはできません。これを行うと、警告が表示されます:無効なオフセットタイプ。

再びマニュアル:

文字列は一連の文字であり、文字はバイトと同じです。これは、PHPが256文字セットのみをサポートしているため、ネイティブUnicodeサポートを提供していないことを意味します。文字列型の詳細を参照してください。

つまり、任意の文字列をキーにすることができます。また、文字列には任意のバイナリデータ(最大2GB)を含めることができます。したがって、キーは任意のバイナリデータにすることができます(文字列は任意のバイナリデータにすることができるため)。

配列キーのランダムな(有効な)乱用:

$w = array(chr(0) => 'null byte?', chr(rand(0, 255)) => 'random byte?');
var_dump($w);

1
明確にするために、それはあなたが配列キーとしてUnicode文字列を使用できないことを意味しません。実際、どのバイナリ文字列でも問題なく機能します。PHPのUnicodeサポートの自称の欠如は、実際には真実ではないため、煩わしいと思います。:)
deceze

1
@deceze Unicodeは「任意のバイナリデータ」のカテゴリに分類されます:)(マニュアルの文言から推測しますが、説明が必要だと思います)。そして、「ネイティブUnicodeサポートを提供しない」と言うことは十分に真実です。PHPコアにはstrlen、substrなどのUnicodeバージョンが含まれていません。「Unicode文字列のネイティブ処理を提供していません」がより適切な場合があります。
コービン2012年

3
確かに、コアにはUnicode文字列を操作する機能は含まれていません。しかし、文字列を操作したくない限り、PHPは文字列を問題なくサポートします。そして現実的に言えば、MB拡張機能はデフォルトで事実上すべてのPHPインストールで利用可能であるため、「コアサポート」かどうかの区別はほとんど学術的です。:)
deceze

1
@deceze多分彼らのメモは「ネイティブではない(mb拡張を参照)」か何かを読むべきです。あなたは正しいです。2005年以降のPHPインストールは基本的にUnicodeをサポートしていますが、PHPでのUnicodeのサポート(拡張子付き)はまだ少し不快だと思います。
コービン2012年

@コービン、なぜあなたはその虐待使用する代わりに呼ぶのですか?
Pacerier 2013

12

キーは文字列または整数である必要があります。いくつかのキャストが行われていますが、マニュアルは次のことをうまく説明していると思います。

キーは整数または文字列のいずれかです。値は任意のタイプにすることができます。

さらに、次のキーキャストが発生します。

  • 有効な整数を含む文字列は、整数型にキャストされます。たとえば、キー「8」は実際には8の下に格納されます。一方、「08」は有効な10進整数ではないため、キャストされません。
  • フロートも整数にキャストされます。これは、小数部分が切り捨てられることを意味します。たとえば、キー8.7は実際には8の下に保存されます。
  • ブールも整数にキャストされます。つまり、キーtrueは実際には1の下に格納され、キーfalseは0の下に格納されます。
  • nullは空の文字列にキャストされます。つまり、キーnullは実際には ""の下に格納されます。
  • 配列とオブジェクトをキーとして使用することはできません。これを行うと、警告が表示されます:無効なオフセットタイプ。

リソースタイプを整数にキャストできるようになったため(これが新機能かどうかはわかりません)、ファイルハンドルやカールハンドルなどを整数にキャストしてキーとして使用することで、間接的にキーとして使用できます。
thomasrutter

10

私はこの答えが私が持っていた問題に関するより多くの情報を探しているのを見つけました。私はUTF-8文字を含む文字列を使用していましたが、これは私が持っていた配列のキーとしては機能しませんでした。

何かのようなもの

$str = "R&D - Solution";
$arr = array( "R&D - Solution" => "Research" );
echo $arr[$str];  // did not work

私にとっての(大きくも賢くもない)解決策はこれを行うことでした。

$str = md5("R&D - Solution");
$arr = array( md5("R&D - Solution") => "Research" );
echo $arr[$str];  // works!

2
配列キーを生成するためのmd5()が好きです。この時点で完全に必要でなくても、それでも安全だと感じます。
ビリノア2014年

2
古いバージョンのPHPを使用していましたか?最初の例はPHP7.1で正常に機能します。
エリオット

bin2hexとは異なりmd5、一意であることが保証されているため、キーとして使用することをお勧めしhex2binます。を使用すると、常に元の状態に戻ります。おそらくそれよりもはるかに速いでしょうmd5
パタンジャリ

6

PHP配列キーは、整数または文字列にすることができます。PHP文字列はバイト配列であり、バイトのシーケンスを意味します。他のタイプの文字列はなく、PHPは配列キー文字列に特別な制限を課しません。言い換えれば、それが文字列である限り、何でもあります。


文字列から整数キーへの暗黙的なキャストは、キーが整数であるかどうかに関係なく特定の関数の動作が異なるため、重要な違いだと思います。たとえば、任意の文字列番号を使用して、配列関数が後で0..n-1からインデックスを再作成することを確認できます。
マシュー

1
同意しましたが、それはこの質問の範囲の境界線上にあると思います。:)
deceze

5

PHP文字列に詰め込めるものはすべて、配列キーとして使用できます。許可される文字に制限はありません。

$a = array();

$x = 'long string of random garage';
echo $a[$x]; // this is ok

$x = array();
echo $a[$x]; // not ok

1

複雑なキーが「未定義のインデックス」エラーを引き起こしている場合は、単に「トリム」の問題がある可能性があります。

複雑なキーが「未定義のインデックス」エラーを吐き出していたので、私は気が狂いそうになりました。おそらくそれは構文違反だと思いました。エラーの原因となった配列キーは、キーに変換して新しい配列で使用していたMySQLデータベースクエリのフィールドから作成されました。キーは次のようにpl_1DNKoiJKwotCqAycickBVhTyなりました。コードの作成方法は次のとおりです。

//new array created from database query
$new_array[$dbquery['fieldname']] = {some value};

//key value found in field of second array
$keyval = $array_two['fieldname'];

//this produced the "undefined index" error
echo $new_array[$keyval];

実際、$keyval$dbquery['fieldname']が完全に一致しているように見えたとき(両方をブラウザにエコーすることで視覚的に確認)。この謎はtrim、2番目のステートメントで次のように使用するだけで解決されました。$keyval = trim($array_two['fieldname']);「トリミング」されると、phpは文句を言いません。

これが他の人をイライラする瞬間から救うことを願っています...


0

個人的には、配列キーの異常な文字に問題はありませんでした。キーがスカラーでなければならないということを除いて、合法であるかどうかは十分に文書化されていません。あなたの最善の策は、それを試して見ることです。


はい、少し一貫性がありませんが、十分に文書化されています。
コービン2012年

0

真実であるすべての答えに加えて:PSRを使用して、優れた標準的なコーディングスタイルを持つための最高のプログラマー間のある種のルールであることができます。



-1

phpページをANSI "é"でエンコードすると使用できるようになります(CinémaはCinémaとして表示されません)。Notepad ++では、メニューEncode => ConvertANSIを使用して保存するだけです


2
(この投稿は、質問に対する質の高い回答を提供していないようです。回答を編集するか、質問へのコメントとして投稿してください)。
sɐunıɔןɐqɐp

それをさらに説明できますか?あればどのようなé存在ではない、OPは、すべての後に++メモ帳を何を使用していない場合はどうなりますか?
ニコハーゼ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.