재귀 함수가 작동하지 않음으로 참조 별 PHP 패스
-
06-07-2019 - |
문제
깊게 중첩 된 물체/배열 콤보에서 슬래시를 추가하거나 제거하는 데 사용하는 두 가지 기능이 있습니다. 배열의 첫 번째 "레벨"은 항상 객체이지만 일부 속성은 배열 또는 객체 일 수 있습니다.
내 두 가지 기능은 다음과 같습니다.
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
.
제휴하지 않습니다 StackOverflow