تمرير 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
.