سؤال

لدي وظيفتان أستخدمهما لإضافة أو إزالة الخطوط المائلة من مجموعة كائن/مصفوفة متداخلة بعمق."المستوى" الأول للمصفوفة هو دائمًا كائن، لكن بعض خصائصه قد تكون مصفوفات أو كائنات.

فيما يلي وظيفتي:

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