Created
May 23, 2014 01:12
-
-
Save uzuna/5f015e4c82675932a751 to your computer and use it in GitHub Desktop.
共通項を持つ配列の順序を保ってマージする
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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