array_udiff()‎

من موسوعة حسوب
< PHP(بالتحويل من PHP/Function/array-udiff)
اذهب إلى التنقل اذهب إلى البحث

(PHP 5, PHP 7)

تحسب الدالة array_udiff()‎ الفرق بين المصفوفات باستخدام دالة callback مُعرّفة من المستخدم للمقارنة بين البيانات.

الوصف

array array_udiff ( array $array1 , array $array2 [, array $... ], callable $value_compare_func)

تحسب الدالة array_udiff()‎ الفرق بين المصفوفات باستخدام دالة callback مُعرّفة من المستخدم للمقارنة بين البيانات. وذلك على عكس الدالة array_diff()‎ التي تستخدم دالة داخلية لمقارنة البيانات.

المعاملات

array1

المصفوفة الأولى.

array2

المصفوفة الثانية.

value_compare_func

دالة المقارنة المُعرفة من المستخدم.

يجب أن تُعيد دالة المقارنة عددًا صحيحًا أقل من أو يساوي أو أكبر من الصفر إذا كان الوسيط الأول يعدّ أقل من أو يساوي أو أكبر من الوسيط الثاني على التوالي. لاحظ أنه قبل PHP 7.0.0 كان يجب أن يكون هذا العدد الصحيح في النطاق من ‎-2147483648 إلى 2147483647.

int callback ( mixed $a, mixed $b )

القيم المعادة

تعيد الدالة array_udiff()‎ مصفوفةً تحتوي على كافة قيم array1 غير الموجودة في أي من الوسائط الأخرى.

أمثلة

المثال 1: مثال على الدالة array_udiff()‎ باستخدام كائنات stdClass

<?php
// المصفوفات المراد مقارنتها
$array1 = array(new stdclass, new stdclass,
               new stdclass, new stdclass,
              );
$array2 = array(
               new stdclass, new stdclass,
              );
// تعيين بعض الخصائص لكل كائن
$array1[0]->width = 11; $array1[0]->height = 3;
$array1[1]->width = 7;  $array1[1]->height = 1;
$array1[2]->width = 2;  $array1[2]->height = 9;
$array1[3]->width = 5;  $array1[3]->height = 7;
$array2[0]->width = 7;  $array2[0]->height = 5;
$array2[1]->width = 9;  $array2[1]->height = 2;
function compare_by_area($a, $b) {
   $areaA = $a->width * $a->height;
   $areaB = $b->width * $b->height;
   
   if ($areaA < $areaB) {
       return -1;
   } elseif ($areaA > $areaB) {
       return 1;
   } else {
       return 0;
   }
}
print_r(array_udiff($array1, $array2, 'compare_by_area'));
?>

سوف تكون مُخرجات المثال أعلاه كالتالي:

Array
(
    [0] => stdClass Object
        (
            [width] => 11
            [height] => 3
        )

    [1] => stdClass Object
        (
            [width] => 7
            [height] => 1
        )

)

المثال 2: مثال على الدالة array_udiff()‎ باستخدام كائنات DateTime

<?php
class MyCalendar {
    public $free = array();
    public $booked = array();

    public function __construct($week = 'now') {
        $start = new DateTime($week);
        $start->modify('Monday this week midnight');
        $end = clone $start;
        $end->modify('Friday this week midnight');
        $interval = new DateInterval('P1D');
        foreach (new DatePeriod($start, $interval, $end) as $freeTime) {
            $this->free[] = $freeTime;
        }
    }

    public function bookAppointment(DateTime $date, $note) {
        $this->booked[] = array('date' => $date->modify('midnight'), 'note' => $note);
    }

    public function checkAvailability() {
        return array_udiff($this->free, $this->booked, array($this, 'customCompare'));
    }
    
    public function customCompare($free, $booked) {
        if (is_array($free)) $a = $free['date'];
        else $a = $free;
        if (is_array($booked)) $b = $booked['date'];
        else $b = $booked;
        if ($a == $b) {
            return 0;
        } elseif ($a > $b) {
            return 1;
        } else {
            return -1;
        }
    }
}

// إنشاء تقويم للمواعيد الأسبوعية
$myCalendar = new MyCalendar;
// حجز بعض المواعيد لهذا الأسبوع
$myCalendar->bookAppointment(new DateTime('Monday this week'), "Cleaning GoogleGuy's apartment.");
$myCalendar->bookAppointment(new DateTime('Wednesday this week'), "Going on a snowboarding trip.");
$myCalendar->bookAppointment(new DateTime('Friday this week'), "Fixing buggy code.");
// تحقق من توفر الأيام بمقارنة التواريخ المحجوزة $booked مقابل التواريخ المتاحة $free
echo "I'm available on the following days this week...\n\n";
foreach ($myCalendar->checkAvailability() as $free) {
   echo $free->format('l'), "\n";
}
echo "\n\n";
echo "I'm busy on the following days this week...\n\n";
foreach ($myCalendar->booked as $booked) {
   echo $booked['date']->format('l'), ": ", $booked['note'], "\n";
}
?>

سوف تكون مُخرجات المثال أعلاه كالتالي:

I'm available on the following days this week...

Tuesday
Thursday


I'm busy on the following days this week...

Monday: Cleaning GoogleGuy's apartment.
Wednesday: Going on a snowboarding trip.
Friday: Fixing buggy code.

ملاحظات

ملاحظة : يرجى ملاحظة أن هذه الدالة تفحص بُعدًا واحدًا فقط من مصفوفةٍ متعددة الأبعاد (n-dimensional). ويمكننا بالطبع فحص أبعاد أعمق باستخدام الأمر التالي على سبيل المثال،

array_udiff ($ array1 [0] , $ array2 [0] , "data_compare_func") ;

انظر أيضًا

  • الدالة array_diff()‎: حساب الفرق بين المصفوفات.
  • الدالة array_diff_assoc()‎: حساب الفرق بين المصفوفات مع استخدام تحقق إضافي بمقارنة الفهارس.
  • الدالة array_diff_uassoc()‎: حساب الفرق بين المصفوفات مع استخدام تحقق إضافي بمقارنة الفهارس يُنفّذ بواسطة دالة مُعرّفة من المستخدم.
  • الدالة array_udiff_assoc()‎: حساب الفرق بين المصفوفات مع استخدام تحقق إضافي بمقارنة الفهارس، ومقارنة البيانات باستخدام دالة مُعرَّفة من المستخدم.
  • الدالة array_udiff_uassoc()‎: حساب الفرق بين المصفوفات مع استخدام تحقق إضافي بمقارنة الفهارس، ومقارنة البيانات والفهارس بواسطة دالة مُعرّفة من المستخدم.
  • الدالة array_intersect()‎: حساب تقاطع المصفوفات.
  • الدالة array_intersect_assoc()‎: حساب تقاطع المصفوفات مع استخدام تحقق إضافي بمقارنة الفهارس.
  • الدالة array_uintersect()‎: حساب تقاطع المصفوفات، ومقارنة البيانات بواسطة دالة مُعرّفة من المستخدم.
  • الدالة array_uintersect_assoc()‎: حساب تقاطع المصفوفات مع استخدام تحقق إضافي بمقارنة الفهارس، ومقارنة البيانات بواسطة دالة مُعرّفة من المستخدم.
  • الدالة array_uintersect_uassoc()‎: حساب تقاطع المصفوفات مع استخدام تحقق إضافي بمقارنة الفهارس، ومقارنة البيانات والفهارس بواسطة دوال منفصلة مُعرّفة من المستخدم.

مصادر