문제

깊게 중첩 된 물체/배열 콤보에서 슬래시를 추가하거나 제거하는 데 사용하는 두 가지 기능이 있습니다. 배열의 첫 번째 "레벨"은 항상 객체이지만 일부 속성은 배열 또는 객체 일 수 있습니다.

내 두 가지 기능은 다음과 같습니다.

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 배열/오브젝트 자체가 아닌 배열/객체의 사본을 사용합니다.

메모: 배열이 아니라면 참조, foreach 배열 자체가 아닌 지정된 배열의 사본에서 작동합니다. foreach 배열 포인터에 약간의 부작용이 있습니다. 배열 포인터에 의존하지 마십시오. foreach 재설정하지 않고.

따라서 참조를 사용하십시오.

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

또는 사용하여 제안한 Kuroki Kaze와 같은 배열 요소/객체 속성 자체를 사용하십시오. $arr[$key] 복사 값 대신 $field.

다른 팁

foreach 가치의 사본을 만든다고 생각합니다.

사용해보십시오 objSlash( $arr[$key], $add ) 강렬한 objSlash( $field, $add ) 내부에 foreach.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top