ラボ > PHP:配列関連

PHP 多重配列の差分取得

「array_diff_assoc()」だと多重配列の比較が出来ないので独自関数を用意

作成日:2023-01-26, 更新日:2023-01-26

独自関数

メソッド: 多重配列に対応させたarray_diff_assoc()

function multiple_array_diff_assoc($ary1, $ary2) {
  $fix_many = array();

  foreach ( $ary1 as $key1 => $val1 ) {
    if ( !array_key_exists($key1, $ary2) ) { // $ary2にキーが無い
      $fix_many[$key1] = $val1;
      continue;
    }

    $val2 = $ary2[$key1];

    if ( !is_array($val1) && !is_array($val2) ) { // 両方配列じゃない
      if ( $val1 != $val2 ) {
        $fix_many[$key1] = $val1;
      }
      continue;
    }
    elseif ( is_array($val1) && is_array($val2) ) { // 両方配列
      // あとでゴニョゴニョするので、ひとまず放置
    }
    else { // 片方が配列
      $fix_many[$key1] = $val1;
      continue;
    }

    $new_diff = multiple_array_diff_assoc($val1, $val2); // 両方配列なので再帰処理
    if ( is_array($new_diff) && 0 < count($new_diff) ) {
      $fix_many[$key1] = $new_diff;
    }
  }

  return $fix_many;
}

呼出し

$ary1 = array(~ 省略 ~);
$ary2 = array(~ 省略 ~);

$diff1 = multiple_array_diff_assoc($ary1, $ary2);
$diff2 = multiple_array_diff_assoc($ary2, $ary1);

$flg_noDiff = true;

if ( is_array($diff1) && 0 < count($diff1) ) { // 「値が変わった」「$ary1で新たなキーが増えた」の両方
  $flg_noDiff = false;
  var_dump($diff1);
}

if ( is_array($diff2) && 0 < count($diff2) ) { // 「値が変わった」「$ary2で新たなキーが増えた」の両方
  $flg_noDiff = false;
  var_dump($diff2);
}

if( $flg_noDiff ) {
  echo '変更なし';
}