3

以前にこの質問があり、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 からキャストされた後に配列を「修正」する方法はありますか?

4

3 に答える 3

2

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

次のように配列を修正できます。

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

このバグレポートで報告されていますが、偽物としてマークされています...ドキュメントには次のように書かれています:

キーはメンバー変数名ですが、いくつかの注目すべき例外があります。整数プロパティにはアクセスできません。

于 2008-11-25T09:08:03.317 に答える
1

少し実験すると、php独自の関数はこの曖昧さを持続させないことがわかります。

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

これは事実上、アレイのコピーを作成するだけで、コピー中に修正が行われます。

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

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

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

次のトリックでは、他の言語が何らかの理由で遭遇したことのない技術的な問題のために、名前空間の区切り文字を破ることができます。

于 2008-11-25T09:17:22.317 に答える
0

ありがとうRoBorg..私もそれを発見しました:)

これがより速いかどうかわからない別の解決策です:

unserialize(serialize($arr));
于 2008-11-25T09:10:57.007 に答える