Skip to content

Instantly share code, notes, and snippets.

@uzuna
Created May 23, 2014 01:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save uzuna/5f015e4c82675932a751 to your computer and use it in GitHub Desktop.
Save uzuna/5f015e4c82675932a751 to your computer and use it in GitHub Desktop.
共通項を持つ配列の順序を保ってマージする
<?php
$ar['A'] = array('dog','cat','mouse','hevin');
$ar['B'] = array('dog','mutsu','andrew','cat','mouse');
//配列をそのまま入れる
$result = merge_serried($ar);
print_r($result);
/**
* 歯抜けの発生する配列を並びを維持したままマージする
*
*/
function merge_serried($model = array())
{
//共通点の取得
$modelMin = call_user_func_array('array_intersect',$model);
//差分の作成
$diff = array();
foreach($model as $key => $va)
{
$diff = array_merge($diff,array_diff($va, $modelMin));
}
$diff = array_unique($diff);
//配列生成
$result = array();
while(count($diff) > 0 || count($modelMin)>0)
{
//差分判定で
$hasdiff = false;
if(count($diff) > 0 ){
foreach($model as $key => $vd) {
if (!$hasdiff && count($vd)>0){
$search = $vd[0]; //0番目のデータをサーチキーとする
//diffに含まれる場合はその値を差し込んで一列削る。
if (($sk=array_search($search, $diff))!==FALSE) {
//echo "Diff : ".$search.PHP_EOL;
$result[] = array_shift($model[$key]);
unset($diff[$sk]);
$hasdiff = true; //置き換えフラグを立てる
}
}else{
//他の列で入れたものと同じ値とだったら削る
if (array_search($search, $vd)!==FALSE ) {
//echo "Remove : ".$search.PHP_EOL;
array_shift($model[$key]);
}
}
}
}
//置き換え発生無しの場合は共通項目として処理
if (!$hasdiff && count($modelMin)>0)
{
//echo "Common : ".current($modelMin).PHP_EOL;
$result[] = array_shift($modelMin); //共通項はそのまま入れる
foreach($model as $key=>$vd) {
array_shift($model[$key]); //すべての列を削る
}
}
}
//print_r($result);
return $result;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment