Я пытаюсь использовать array_intersect
для сравнения двух массивов массивов.
$start[]=array( 'id'=>1, 'name'=>'Up', 'action'=>'up' ); $start[]=array( 'id'=>3, 'name'=>'Down', 'action'=>'down' ); $start[]=array( 'id'=>5, 'name'=>'Left', 'action'=>'left' ); $end[]=array( 'id'=>1, 'name'=>'Up', 'action'=>'up' ); $end[]=array( 'id'=>9, 'name'=>'Up', 'action'=>'up' ); $result=array_intersect($start,$end);
Однако я всегда получаю уведомление:
Примечание. Преобразование массива в строку в файле testfile.php в строке xyz
И сравнения на самом деле не происходит.
Каков наилучший способ сравнить два массива, не изобретая колесо или не прибегая к чему-то слишком сложному?
Array_diff и array_intersect преобразуют каждый элемент в первичный массив в строку для сравнения. Если вы хотите другое сравнение, вы можете использовать метод обратного вызова со следующими встроенными функциями:
array_uintersect_assoc() - Computes the intersection of arrays with additional index check, compares data by a callback function array_intersect_uassoc() - Computes the intersection of arrays with additional index check, compares indexes by a callback function array_uintersect_uassoc() - Computes the intersection of arrays with additional index check, compares data and indexes by a callback functions
Я нашел их, выполнив поиск PHP.net для функции array_diff и выполнив соответствующие функциональные ссылки. Это отличный способ увидеть альтернативы для чего-то.
Кто-то еще в другом месте предложил array_map и сериализован. Я закончил с этим – это, безусловно, намного проще, чем вложенность и рекурсия, и неудачно провалилась, пытаясь в основном переписать функцию array_intersect.
echo '<pre>'; $start[]=array( 'id'=>1, 'name'=>'Up', 'action'=>'up' ); $start[]=array( 'id'=>3, 'name'=>'Down', 'action'=>'down' ); $start[]=array( 'id'=>5, 'name'=>'Left', 'action'=>'left' ); $start[]=array( 'id'=>2, 'name'=>'Left', 'action'=>'left' ); $end[]=array( 'name'=>'Up', 'id'=>1, 'action'=>'up' ); $end[]=array( 'id'=>8, 'name'=>'Right', 'action'=>'Right' ); function serialize_array_values($arr){ foreach($arr as $key=>$val){ sort($val); $arr[$key]=serialize($val); } return $arr; } $result = array_map("unserialize", array_intersect(serialize_array_values($start),serialize_array_values($end))); echo "\n\n\n"; echo var_dump($result); echo '</pre>';