奇妙な文字がたくさん入力されているphp配列キーがいくつかあります。
これは許可されていますか?使用できないものに制約はありますか?
回答:
マニュアルによると:
キーは整数または文字列のいずれかです。値は任意のタイプにすることができます。
さらに、次のキーキャストが発生します。
- 有効な整数を含む文字列は、整数型にキャストされます。たとえば、キー「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);
キーは文字列または整数である必要があります。いくつかのキャストが行われていますが、マニュアルは次のことをうまく説明していると思います。
キーは整数または文字列のいずれかです。値は任意のタイプにすることができます。
さらに、次のキーキャストが発生します。
- 有効な整数を含む文字列は、整数型にキャストされます。たとえば、キー「8」は実際には8の下に格納されます。一方、「08」は有効な10進整数ではないため、キャストされません。
- フロートも整数にキャストされます。これは、小数部分が切り捨てられることを意味します。たとえば、キー8.7は実際には8の下に保存されます。
- ブールも整数にキャストされます。つまり、キーtrueは実際には1の下に格納され、キーfalseは0の下に格納されます。
- nullは空の文字列にキャストされます。つまり、キーnullは実際には ""の下に格納されます。
- 配列とオブジェクトをキーとして使用することはできません。これを行うと、警告が表示されます:無効なオフセットタイプ。
私はこの答えが私が持っていた問題に関するより多くの情報を探しているのを見つけました。私は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!
bin2hex
とは異なりmd5
、一意であることが保証されているため、キーとして使用することをお勧めしhex2bin
ます。を使用すると、常に元の状態に戻ります。おそらくそれよりもはるかに速いでしょうmd5
。
複雑なキーが「未定義のインデックス」エラーを引き起こしている場合は、単に「トリム」の問題がある可能性があります。
複雑なキーが「未定義のインデックス」エラーを吐き出していたので、私は気が狂いそうになりました。おそらくそれは構文違反だと思いました。エラーの原因となった配列キーは、キーに変換して新しい配列で使用していた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は文句を言いません。
これが他の人をイライラする瞬間から救うことを願っています...
PHP配列では、キー:2.3または10進数を使用できません
phpページをANSI "é"でエンコードすると使用できるようになります(CinémaはCinémaとして表示されません)。Notepad ++では、メニューEncode => ConvertANSIを使用して保存するだけです
é
存在ではない、OPは、すべての後に++メモ帳を何を使用していない場合はどうなりますか?
$a = (object) ['@km³' => 123]; error_log($a->@km³);