"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية تصفية الصفوف من مصفوفة ثنائية الأبعاد بناءً على التقاطع مع مصفوفة ثنائية الأبعاد أخرى في PHP؟

كيفية تصفية الصفوف من مصفوفة ثنائية الأبعاد بناءً على التقاطع مع مصفوفة ثنائية الأبعاد أخرى في PHP؟

تم النشر بتاريخ 2024-11-08
تصفح:706

How to Filter Rows from a 2D Array Based on Intersection with Another 2D Array in PHP?

تصفية صفوف مصفوفة ثنائية الأبعاد بناءً على تقاطعات الصف

في PHP، تم تصميم وظيفة array_diff_assoc() للعثور على الفرق بين صفيفين مع إعطاء الأولوية لقيمة المفتاح أزواج. ومع ذلك، أثناء استخدام هذه الوظيفة لتصفية الصفوف من مصفوفة ثنائية الأبعاد بناءً على التقاطع مع مصفوفة ثنائية الأبعاد أخرى، فقد لا تؤدي دائمًا إلى النتائج المتوقعة.

فهم المشكلة

تنشأ المشكلة بسبب المقارنة الصارمة التي تجريها array_diff_assoc(). يقارن تمثيلات السلسلة لأزواج القيمة الرئيسية أثناء المقارنة. وهذا يعني أنه حتى لو كان هناك زوجان من المفاتيح والقيمة يحتويان على نفس القيم، فإنهما لا يعتبران متساويين إلا إذا كانت تمثيلات السلسلة الخاصة بهما متطابقة.

نموذج البيانات

ضع في اعتبارك نموذج البيانات التالي:

$array1 = [
    [12 => 'new q sets'],
    [11 => 'common set']
];

$array2 = [
    [11 => 'common set']
];

إخراج غير صحيح

عندما نحاول استخدام array_diff_assoc() لتصفية $array1 بناءً على الصفوف في $array2، نحصل على إخراج غير صحيح:

$output = array_diff_assoc($array1, $array2);

print_r($output);
// Output: [
//     [11 => 'common set']
// ]

يوضح هذا الإخراج أن الصف المشترك موجود في النتيجة، بينما يجب أن يحتوي الإخراج المقصود على الصف الحصري من $array1.

سبب المشكلة

كما ذكرنا سابقًا، تكمن المشكلة في المقارنة الصارمة التي يتم إجراؤها بواسطة array_diff_assoc(). عند مقارنة المصفوفتين التاليتين:

Array ( [0] => "Array" [1] => "Array" )
Array ( [0] => "Array" )

ترجع الدالة زوج المفتاح والقيمة المختلف كنتيجة لأن أزواج المفتاح والقيمة ليست متطابقة في السلسلة.

المنهج الصحيح

لمعالجة هذه المشكلة، يمكننا استخدام نهج مختلف قليلاً للتحقق من وجود قيم أساسية محددة في المصفوفات:

$filteredRows = array_filter($array1, function($row) use ($array2) {
    return !in_array($row, $array2);
});

print_r($filteredRows);
// Output: [
//     [12 => 'new q sets']
// ]

يستخدم هذا الأسلوب in_array() للتحقق مما إذا كان كل صف من $array1 موجودًا في $array2. إذا لم يكن هناك صف في $array2، فسيتم تضمينه في النتائج التي تمت تصفيتها.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3