Сравнивать значения из трех массивов PHP? - PullRequest
1 голос
/ 20 января 2012

У меня может быть глупый вопрос?

У меня есть три массива. И я хочу получить разные значения из первого и третьего массива. Я создал следующий код, но возвращаемые значения неверны.

function ec($str){
    echo $str.'<br>';
}

$arr1 = array( array(
                    'letter' => 'A',
                    'number' => '1'
                ),

               array(
                    'letter' => 'B',
                    'number' => '2'
                ),

               array(
                    'letter' => 'C',
                    'number' => '3'
                )

    );

$arr2 = array( array(
                    'letter' => 'A',
                    'number' => '1'
                ),

               array(
                    'letter' => 'B',
                    'number' => '2'
                )

    );



 $arr3 = array( array(
                    'letter' => 'D',
                    'number' => '4'
                ),

               array(
                    'letter' => 'E',
                    'number' => '5'
                )

    );

    $mergeArr = array_merge($arr1,$arr3);
    foreach ($mergeArr as $kMerge => $vMerge){
        foreach ($arr2 as $val2){
            if($val2['letter'] != $mergeArr[$kMerge]['letter']){
                ec($mergeArr[$kMerge]['letter']);
            }
        }
    }

Результат этого кода:

A
B
C
C
D
D
E
E

Результат, который я хочу:

    C
    D
    E

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 20 января 2012

На основании результата, который вы ищете, это должно сделать это:

$mergeArr = array_merge($arr1,$arr3);

$res = array_diff_assoc($mergeArr, $arr2);

var_dump($res);

См. Фрагмент на кодовой панели .

1 голос
/ 20 января 2012

Если я понимаю, что вы пытаетесь сделать правильно, эта функция должна выполнить эту работу:

function find_unique_entries () {
  $found = $repeated = array();
  $args = func_get_args();
  $key = array_shift($args);
  foreach ($args as $arg) {
    if (!is_array($arg)) return FALSE; // all arguments muct be arrays
    foreach ($arg as $inner) {
      if (!isset($inner[$key])) continue; 
      if (!in_array($inner[$key], $found)) {
        $found[] = $inner[$key];
      } else {
        $repeated[] = $inner[$key];
      }
    }
  }
  return array_diff($found, $repeated);
}

Передайте ключ, который вы ищете, первым аргументам, а затем столько массивов, сколько вам нужно в последующих аргументах. Возвращает массив результатов или FALSE при ошибке.

Таким образом, ваша строка использования будет:

$result = find_unique_entries('letter', $arr1, $arr2, $arr3);

Посмотри, как работает

1 голос
/ 20 января 2012

Попробуйте это вместо вашего foreach:

 $diff = array_diff($mergeArr, $arr2);

 foreach( $diff as $d_k => $d_v ) {
   ec($d_v['letter']);
 }
...