PHPが再帰関数の参照渡しを機能しない
-
06-07-2019 - |
質問
深くネストされたオブジェクト/配列コンボのスラッシュを追加または削除するために使用している2つの関数があります。最初の「レベル」配列のオブジェクトは常にオブジェクトですが、そのプロパティの一部は配列またはオブジェクトです。
ここに私の2つの関数があります:
function objSlash( &$obj, $add=true )
{
foreach ( $obj as $key=>$field )
{
if ( is_object( $field ) )
objSlash( $field, $add );
else if ( is_array( $field ) )
arrSlash( $field, $add );
else if ( $add )
$obj->$key = addslashes( $field );
else
$obj->$key = stripslashes( $field );
}
return;
}
function arrSlash( &$arr, $add=true )
{
foreach ( $arr as $key=>$field )
{
if ( is_object( $field ) )
objSlash( $field, $add );
else if ( is_array( $field ) )
arrSlash( $field, $add );
else if ( $add )
$arr[$key] = addslashes( $field );
else
$arr[$key] = stripslashes( $field );
}
return;
}
次のように呼び出される:
objSlash( $obj, false );
ただし、この関数はネストされた配列からスラッシュを削除しません。関数に渡されるオブジェクトは次のようなものです:
stdClass Object
(
[id] => 3
[lines] => Array
(
[0] => Array
(
[character] => Name
[dialogue] => Something including \"quotes\"
)
)
)
間違ったことは何ですか?線に沿ったどこかで参照が欠落しています...
解決
foreach
は、配列ではなく配列/オブジェクトのコピーを使用します/ object自体:
したがって、いずれかの参照を使用します:
foreach ($arr as $key => &$field) {
// …
}
または、コピーされた値 $ field
の代わりに $ arr [$ key]
を使用することによって提案された黒木風のような配列要素/オブジェクトプロパティ自体を使用します。
他のヒント
foreach
は値のコピーを作成します。
foreach
内で objSlash($ arr [$ key]、$ add)
の代わりに objSlash($ field、$ add)
を使用してみてください。
所属していません StackOverflow