<?xml version="1.0" encoding="utf-8"?> <!-- $Revision$ --> <refentry xml:id="function.array-udiff" xmlns="http://docbook.org/ns/docbook"> <refnamediv> <refname>array_udiff</refname> <refpurpose>Computes the difference of arrays by using a callback function for data comparison</refpurpose> </refnamediv> <refsect1 role="description"> &reftitle.description; <methodsynopsis> <type>array</type><methodname>array_udiff</methodname> <methodparam><type>array</type><parameter>array</parameter></methodparam> <methodparam rep="repeat"><type>array</type><parameter>arrays</parameter></methodparam> <methodparam><type>callable</type><parameter>value_compare_func</parameter></methodparam> </methodsynopsis> <para> Computes the difference of arrays by using a callback function for data comparison. This is unlike <function>array_diff</function> which uses an internal function for comparing the data. </para> </refsect1> <refsect1 role="parameters"> &reftitle.parameters; <para> <variablelist> <varlistentry> <term><parameter>array</parameter></term> <listitem> <para> The first array. </para> </listitem> </varlistentry> <varlistentry> <term><parameter>arrays</parameter></term> <listitem> <para> Arrays to compare against. </para> </listitem> </varlistentry> <varlistentry> <term><parameter>value_compare_func</parameter></term> <listitem> <para> The callback comparison function. </para> <para> &return.callbacksort; </para> &callback.cmp; </listitem> </varlistentry> </variablelist> </para> </refsect1> <refsect1 role="returnvalues"> &reftitle.returnvalues; <para> Returns an array containing all the values of <parameter>array</parameter> that are not present in any of the other arguments. </para> </refsect1> <refsect1 role="examples"> &reftitle.examples; <para> <example> <title><function>array_udiff</function> example using stdClass Objects</title> <programlisting role="php"> <![CDATA[ <?php // Arrays to compare $array1 = array(new stdclass, new stdclass, new stdclass, new stdclass, ); $array2 = array( new stdclass, new stdclass, ); // Set some properties for each object $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')); ?> ]]> </programlisting> &example.outputs; <screen> <![CDATA[ Array ( [0] => stdClass Object ( [width] => 11 [height] => 3 ) [1] => stdClass Object ( [width] => 7 [height] => 1 ) ) ]]> </screen> </example> </para> <para> <example> <title><function>array_udiff</function> example using DateTime Objects</title> <programlisting role="php"> <![CDATA[ <?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; } } } // Create a calendar for weekly appointments $myCalendar = new MyCalendar; // Book some appointments for this week $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."); // Check availability of days by comparing $booked dates against $free dates 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"; } ?> ]]> </programlisting> &example.outputs; <screen> <![CDATA[ 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. ]]> </screen> </example> </para> </refsect1> <refsect1 role="notes"> &reftitle.notes; <note> <simpara> Please note that this function only checks one dimension of a n-dimensional array. Of course you can check deeper dimensions by using <literal>array_udiff($array1[0], $array2[0], "data_compare_func");</literal>. </simpara> </note> </refsect1> <refsect1 role="seealso"> &reftitle.seealso; <para> <simplelist> <member><function>array_diff</function></member> <member><function>array_diff_assoc</function></member> <member><function>array_diff_uassoc</function></member> <member><function>array_udiff_assoc</function></member> <member><function>array_udiff_uassoc</function></member> <member><function>array_intersect</function></member> <member><function>array_intersect_assoc</function></member> <member><function>array_uintersect</function></member> <member><function>array_uintersect_assoc</function></member> <member><function>array_uintersect_uassoc</function></member> </simplelist> </para> </refsect1> </refentry> <!-- Keep this comment at the end of the file Local variables: mode: sgml sgml-omittag:t sgml-shorttag:t sgml-minimize-attributes:nil sgml-always-quote-attributes:t sgml-indent-step:1 sgml-indent-data:t indent-tabs-mode:nil sgml-parent-document:nil sgml-default-dtd-file:"~/.phpdoc/manual.ced" sgml-exposed-tags:nil sgml-local-catalogs:nil sgml-local-ecat-files:nil End: vim600: syn=xml fen fdm=syntax fdl=2 si vim: et tw=78 syn=sgml vi: ts=1 sw=1 -->