2015-06-04 4 views
4

массив 1: $ tags_resultСравнение двух массивов объектов с array_udiff

array (size=4) 
    0 => 
    object(stdClass)[8] 
     public 'id_tag' => string '2' (length=1) 
     public 'tag' => string 'tag 1' (length=5) 
    1 => 
    object(stdClass)[9] 
     public 'id_tag' => string '5' (length=1) 
     public 'tag' => string 'tag 4' (length=5) 
    2 => 
    object(stdClass)[10] 
     public 'id_tag' => string '6' (length=1) 
     public 'tag' => string 'tag 7' (length=5) 
    3 => 
    object(stdClass)[11] 
     public 'id_tag' => string '7' (length=1) 
     public 'tag' => string 'tag 9' (length=5) 

Массив 2: $ post_tags_result

array (size=2) 
    0 => 
    object(stdClass)[5] 
     public 'id_tag' => string '2' (length=1) 
     public 'tag' => string 'tag 1' (length=5) 
    1 => 
    object(stdClass)[6] 
     public 'id_tag' => string '6' (length=1) 
     public 'tag' => string 'tag 7' (length=5) 

Я пытаюсь извлечь значения из массива 1, которые не появляются в массив 2:

function foo($tags_result, $post_tags_result){ 
    return $tags_result->id_tag != $post_tags_result->id_tag; 
} 

$difference_tags = array_udiff($tags_result, $post_tags_result, 'foo'); 

Но результат возвращает общее значение: тег 1. Я ожидаю, просто помечать 4 и тег 9.

array (size=3) 
    0 => 
    object(stdClass)[8] 
     public 'id_tag' => string '2' (length=1) 
     public 'tag' => string 'tag 1' (length=5) 
    1 => 
    object(stdClass)[9] 
     public 'id_tag' => string '5' (length=1) 
     public 'tag' => string 'tag 4' (length=5) 
    3 => 
    object(stdClass)[11] 
     public 'id_tag' => string '7' (length=1) 
     public 'tag' => string 'tag 9' (length=5) 

ответ

4

В качестве альтернативы вы можете собрать все теги, которые должны были быть исключены первыми. Затем после этого вы можете фильтровать его через array_filter и получить желаемый результат. Грубый пример:

$tags = array(); 
foreach($post_tags_result as $t) { 
    $tags[] = $t->tag; // gather all tags 
} 
// filter array using gathered tags 
$result = array_filter($tags_result, function($v) use($tags){ 
    return !in_array($v->tag, $tags); 
}); 

Sample Output

0

В руководстве:

Функция сравнения должна возвращать целое число меньше, равным или больше нуля, если первый аргумент считается соответственно меньше, равно или больше второго.

Итак, вместо логического сравнения вы должны сделать diff для удаления одинаковых предметов. Так как вы сравниваете числовые значения, вы должны сделать что-то вроде:

$ php -a 

php > $a = [['id'=>1],['id'=>2],['id'=>3],['id'=>4]]; 
php > $b = [['id'=>1],['id'=>4]]; 
php > $c = array_udiff($a, $b, function($a, $b){ 
       return $a['id'] - $b['id']; 
      }); 
php > print_r($c); 
Array 
(
    [1] => Array 
     (
      [id] => 2 
     ) 

    [2] => Array 
     (
      [id] => 3 
     ) 

) 

В вашем случае:

$difference_tags = array_udiff($tags_result, $post_tags_result, function(($a1, $a2){ 
    return $a1->id_tag - $q2->id_tag; 
})); 
Смежные вопросы