2012-01-18 2 views
1

Вот два массива свалка:PHP: Проверка разницы между двумя MultiDim массивами

array(2) { 
    [0]=> array(7) { 
     ["id"]=> string(1) "1" 
     ["shoppinglist_id"]=> string(1) "1" 
     ["product_id"]=> string(1) "1" 
     ["amount"]=> string(1) "5" 
     ["date_added"]=> string(10) "1326912709" 
     ["name"]=> string(7) "Tunfisk" 
     ["supplier_id"]=> string(1) "2" 
    } 
    [1]=> array(7) { 
     ["id"]=> string(1) "2" 
     ["shoppinglist_id"]=> string(1) "1" 
     ["product_id"]=> string(1) "2" 
     ["amount"]=> string(1) "5" 
     ["date_added"]=> string(10) "1326912713" 
     ["name"]=> string(3) "Lax" 
     ["supplier_id"]=> string(1) "6" 
    } 
} 

array(2) { 
    [0]=> array(7) { 
     ["id"]=> string(1) "5" 
     ["shoppinglist_id"]=> string(1) "3" 
     ["product_id"]=> string(1) "1" 
     ["amount"]=> string(1) "5" 
     ["date_added"]=> string(10) "1326912810" 
     ["name"]=> string(7) "Tunfisk" 
     ["supplier_id"]=> string(1) "2" 
    } 
    [1]=> array(7) { 
     ["id"]=> string(1) "6" 
     ["shoppinglist_id"]=> string(1) "3" 
     ["product_id"]=> string(1) "2" 
     ["amount"]=> string(1) "5" 
     ["date_added"]=> string(10) "1326912810" 
     ["name"]=> string(3) "Lax" 
     ["supplier_id"]=> string(1) "6" 
    } 
} 

Я пытался сделать array_diff(), но это не поддерживает многомерные массивы.

Итак я попробовал эту функцию:

public function multidimensional_array_diff($a1,$a2) 
{ 
    $r = array(); 

foreach ($a2 as $key => $second) 
{ 
     foreach ($a1 as $key => $first) 
     { 

      if (isset($a2[$key])) 
      { 
       foreach ($first as $first_arraykey => $first_value) 
       { 

        foreach ($second as $second_value) 
        { 
         if ($first_value == $second_value) 
         { 
          $true = true; 
          break; 
         } 
        } 
        if (!isset($true)) 
        { 
         if($first_arraykey != "date_added" && $first_arraykey != "shoppinglist_id") 
         { 
          $r[$key][$first_arraykey] = $first_value; 
         } 

        } 
        unset($true); 
       } 
      } 
      else 
      { 
       $r[$key] = $first; 
      } 
     } 
} 
    return $r; 
} 

Это не работает, либо, возвращает мне различия, что ARENT разные.

Обратите внимание, что вы можете видеть, что это не добавляет к разностному массиву, если ключ массива - date_added и shoppinglist_id (потому что в моей системе все в порядке, так как это разные).

Вышеупомянутый должен выводить пустой массив разностей, поскольку нет разницы между этими массивами (если мы не смотрим date_added и shoppinglist_id).

Как я могу сделать эту работу правильно?

+1

Можете ли вы форматировать массив drumps – jprofitt

+0

Ok здесь отформатированы: http://pastebin.com/4HkFyBvy – Karem

ответ

8

В комментариях к array_diff приведены некоторые рекурсивные примеры. Это один, кажется, делать то, что вы ищете:

<?php 
function arrayRecursiveDiff($aArray1, $aArray2) { 
    $aReturn = array(); 

    foreach ($aArray1 as $mKey => $mValue) { 
     if (array_key_exists($mKey, $aArray2)) { 
      if (is_array($mValue)) { 
       $aRecursiveDiff = arrayRecursiveDiff($mValue, $aArray2[$mKey]); 
       if (count($aRecursiveDiff)) { $aReturn[$mKey] = $aRecursiveDiff; } 
      } else { 
       if ($mValue != $aArray2[$mKey]) { 
        $aReturn[$mKey] = $mValue; 
       } 
      } 
     } else { 
      $aReturn[$mKey] = $mValue; 
     } 
    } 

    return $aReturn; 
} 
?> 

Источник: http://www.php.net/manual/en/function.array-diff.php#91756

+0

этот пример, похоже, работает, но порядок имеет значение. Вы знаете какой-нибудь пример, где порядок не имеет значения? – nhenrique

Смежные вопросы