質問

以前にこの質問があり、5.2.5のバグであると結論付けられました。少なくとも、私にとっては5.2.6ではまだ壊れています:

破損または機能するかどうかをお知らせください:

$obj = new stdClass();
$obj->{"foo"} = "bar";
$obj->{"0"} = "zero";
$arr = (array)$obj;

//foo -- bar
//0 --    {error: undefined index}
foreach ($arr as $key=>$value){
    echo "$key -- " . $arr[$key] . "\n";
}

「修正」するあらゆる方法stdClassからキャストされた後の配列?

役に立ちましたか?

解決

間違いなくバグのようです(PHP 5.2.6)。

このように配列を修正できます:

$arr = array_combine(array_keys($arr), array_values($arr));

このバグレポートで報告されていますが、偽とマークされています。 ドキュメントには:

  

キーはメンバー変数です   いくつかの顕著な例外を除き、名前:   整数のプロパティにはアクセスできません。

他のヒント

少しの実験により、PHPの独自の関数はこの不信を持続しないことが示されています。

function noopa( $a ){ return $a; }
$arr = array_map('noopa', $arr ); 
$arr[0]; # no error! 

これは実際には、配列のコピーを作成するだけで、コピー中に修正が行われます。

最終的には、全体的な設計の失敗です。array_mergeを、数値キーと文字列キーが混在する配列で機能すると思う方法で使用してみてください。

すべての番号付き要素はコピーされ、一部は文字列でカプセル化された番号である場合でも番号が付け直されます。その結果、この問題を解決するためにarray_mergeの自作の実装が多数あります。

phpがperlのクローンを作ろうとして失敗したとき、彼らは配列とハッシュの概念を明確な概念として理解せず、代わりにそれらを1つの普遍的な傘にまとめました。良い調子!。

次のトリックでは、なんらかの理由で他の言語では発生しない技術的な問題のために、ネームスペース区切り文字を壊すことに成功しています。

RoBorgに感謝します。私もそれを発見しました:)

別の解決策がありますが、高速かどうかはわかりません:

unserialize(serialize($arr));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top