Recursive fonksiyon çalışmıyor referans PHP pas

2 Cevap php

Ben iç içe nesne / dizi combo slashes eklemek veya kaldırmak için kullanıyorum iki işlevi vardır. Dizinin ilk "seviye" her zaman bir nesne, ama onun bazı özelliklerini diziler veya nesneler olabilir.

İşte benim iki işlevleri şunlardır:

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;
}

Şöyle çağrıldığını:

objSlash( $obj, false );

Ancak, işlevi iç içe diziden eğik şerit yok. Işlev geçirilen nesne gibi budur:

stdClass Object
(
    [id] => 3
    [lines] => Array
        (
            [0] => Array
                (
                    [character] => Name
                    [dialogue] => Something including \"quotes\"
                )
        )
)

Neyi yanlış yaptım? Somewhere hattı boyunca bir referans eksik gidiyor ...

2 Cevap

foreach dizi / nesnenin bir kopyasını kullanır ve dizi / kendini nesne değil:

Dizi referenced sürece Note:, foreach belirtilen dizinin bir kopyası olup, dizinin kendisi üzerinde çalışır. foreach dizisi işaretçisi üzerinde bazı yan etkileri vardır. Sıfırlayarak olmadan foreach sırasında veya sonrasında dizi işaretçisi güvenmeyin.

Yani bir başvuru kullanabilirsiniz:

foreach ($arr as $key => &$field) {
    // …
}

Veya $arr[$key] yerine kendi kopyaladığınız değeri kullanılarak dizi öğesi / nesne özelliğini kendisi like Kuroki Kaze suggested kullanmak $field.

foreach değerinin bir kopyasını yapar herhalde.

objSlash( $field, $add ) inside objSlash( $arr[$key], $add ) intead kullanmayı deneyin foreach.