2015-10-07 2 views
2

У меня возникают проблемы с array_diff_assoc, потому что результат неправильный. Im'm получает ключ [3] в результате в $ diff, но он существует как в $ c1, так и в $ c2, поэтому результат в $ diff не имеет смысла, так как я использую array_diff_assoc(). Я должен получить ключ [0] из $ c2 вместе с двумя другими ключами [1] и [2] из $ diff, которые являются правильными.Проблема с использованием array_diff_assoc в php

результаты QUERY1 в этом массиве $ c2

Array([0] => Array 
     ([PROCESSO] => 1614436 
     [DATAMSG] => 2015-04-27 22 
     [CATEGORIA_DESC] => ECG_HR       
     [VALOR] => 135 
     [CRITICO] => 1) 
    [1] => Array 
     ([PROCESSO] => 1614436 
     [DATAMSG] => 2015-04-27 23 
     [CATEGORIA_DESC] => ECG_HR       
     [VALOR] => 121 
     [CRITICO] => 1) 
    [2] => Array 
     ([PROCESSO] => 1614436 
     [DATAMSG] => 2015-04-27 23 
     [CATEGORIA_DESC] => ECG_HR       
     [VALOR] => 123 
     [CRITICO] => 1) 
    [3] => Array 
     ([PROCESSO] => 1614436 
     [DATAMSG] => 2015-04-27 23 
     [CATEGORIA_DESC] => ECG_HR       
     [VALOR] => 125 
     [CRITICO] => 1)) 

Запрос 2 результаты в этом массиве $ c1

Array([0] => Array 
     ([PROCESSO] => 1614436 
     [DATAMSG] => 2015-04-27 23 
     [CATEGORIA_DESC] => ECG_HR       
     [VALOR] => 125 
     [CRITICO] => 1)) 

Затем я использую $diff=array_diff_assoc($c2,$c1); и я получаю результаты ниже в массиве $ дифф.

Array([1] => Array 
     ([PROCESSO] => 1614436 
     [DATAMSG] => 2015-04-27 23 
     [CATEGORIA_DESC] => ECG_HR       
     [VALOR] => 121 
     [CRITICO] => 1) 
    [2] => Array 
     ([PROCESSO] => 1614436 
     [DATAMSG] => 2015-04-27 23 
     [CATEGORIA_DESC] => ECG_HR       
     [VALOR] => 123 
     [CRITICO] => 1) 
    [3] => Array 
     ([PROCESSO] => 1614436 
     [DATAMSG] => 2015-04-27 23 
     [CATEGORIA_DESC] => ECG_HR       
     [VALOR] => 125 
     [CRITICO] => 1)) 

EDIT: Я попытался с помощью $diff=array_udiff_assoc($c2,$c1, array("cr", "comp_func_cr")); с ниже функции, как в примере php.net, но это возвращение то же самое, как и с array_diff_assoc.

class cr { 
    private $priv_member; 
    function cr($val) 
    {$this->priv_member = $val;} 
    static function comp_func_cr($c2, $c1) 
    {if ($c2->priv_member === $c1->priv_member) return 0; 
     return ($c2->priv_member > $c1->priv_member)? 1:-1;}} 
+0

Не говорю, что это ответ, но вот что-то для справки, в случае, если это помогает: HTTP : //stackoverflow.com/questions/19964353/array-diff-on-array-of-associative-arrays-in-php –

ответ

1

Попробуйте следующее

<?php 
foreach($c2 as $key=>$v1){ 
    if(in_array($v1, $c1)){ 
     unset($c2[$key]); 
    } 
} 
print_r($c2); 
?> 

или вы можете сделать функцию и использовать его пример:

<?php 
function array_defference($a1,$a2){ 
      if(sizeof($a1) >= sizeof($a2)){ 
       $large = $a1; 
       $small = $a2; 
      }else{ 
       $large = $a2; 
       $small = $a1; 
      } 

      foreach($large as $key=>$v1){ 
       if(in_array($v1, $small)){ 
        unset($large[$key]); 
       } 
      } 
      return $large; 

     } 
     $reuslt = array_defference($c2,$c1); 
     print_r($reuslt); 
?> 
+1

Это будет работать, только если все элементы $ c1 находятся в $ c2, а $ c2 - это больший массив ... Он отвечает на этот точный вопрос, но не очень многократно используется повторно. –

+0

Возможно, это можно использовать повторно. Спасибо @William_Wilson за ваши отзывы –

+0

Да, он отлично работает. Так как $ c2 всегда больше или равно, я верю. – Zalif

0

array_diff_assoc(array1,array2) Сравнивает array1 против массив2 и возвращает разницу. В отличие от array_diff() в сравнении используются также ключи массива. Это на самом деле сравнивается с вашим ключом массива, поэтому результат похож на ваш особняк. В вашем случае вам нужно использовать это array_udiff_assoc($c2,$c1). Вычисляет разницу в массивах с дополнительной проверкой индекса, сравнивает данные с помощью функции обратного вызова.

+0

Пробовал, но не повезло, проверьте мое редактирование, чтобы проверить, правильно ли я сделал это. – Zalif

1

Чтобы расширить предыдущий ответ:

function array2D_diff($c1, $c2) 
{ 
    $c3 = Array(); 
    foreach($c2 as $key=>$v) 
    { 
     if(!in_array($v, $c1)) 
     { 
      $c3[] = $v; 
     } 
    } 

    foreach($c1 as $key=>$v) 
    { 
     if(!in_array($v, $c2)) 
     { 
      $c3[] = $v; 
     } 
    } 

    return $c3; 
} 

print_r(array2D_diff($c2, $c1)); 

Это будет работать независимо от порядка прохождения $ c2 и $ c1.

+0

Я пробовал это, как вы сказали, но не работал, я редактировал свой пост с моей попыткой. – Zalif

+1

Как вы называете array_udiff_assoc? –

+0

Как я писал в части редактирования. – Zalif

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