私は2つの配列を持ってい$arr1
ます$arr2
:
$arr1
は、Excel ファイルから読み取ると予想される列のリストです$arr2
。実際に見つかった列の配列です。
アップロードされたファイルに
- 列名のスペルミス
- 異なる順序の列
- 一部の列が欠落している可能性があります
- また、列名には異なる文字セットの文字が含まれている場合があります (たとえば、ギリシャ語の 'M' はラテン語の M のように見えますが、同じと見なすことはできません)。
たとえば、次の 2 つの配列があるとします。
$arr1 = array('Action', 'LotSize', 'QuantityMinimum', 'SupplierName', 'SPN',
'PartNumExt', 'UOM', 'ListPrice', 'MPN', 'MFrName', 'CatLevel1', 'CatLevel2',
'CatLevel3', 'CatLevel4', 'CatLevel5', 'CatLevel6', 'AcctLevel1', 'AcctLevel2',
'AcctLevel3', 'AcctLevel4', 'AcctLevel5', 'AcctLevel6', 'Desc1', 'Desc2', 'PicName',
'SupplierURL', 'CatPart','TechSpec', 'Kad');
$arr2 = array('Action', 'LotSze', 'QuantityMinimum', 'SupplierName', 'SPN',
'PartNumEx', 'UOM', 'ListPric', 'MPN', 'MfrName', 'CatLevel1', 'CatLevel2',
'CatLevel3', 'CatLevel4', 'AcctLevel1', 'AcctLevel2', 'AcctLevel3', 'AcctLevel4',
'Desc1', 'Desc2', 'PicName', 'SupplierURL', 'CatPart');
2 つの配列を比較し、一致する要素の位置を 3 番目の配列に保存する必要があります。
$arr3 = ([0]=>0, [1]=>1, [2]=>3, [3]=>5, [4]=>6, [5]=>...);
$arr1
inの一致した各要素の位置を表示し$arr2
ます。
「一致する」とは、同一のすべての要素 (例: Action )、または部分的に同じ (例: Test & Tes )、および類似しているが大文字と小文字が異なる要素 (例: Foo & foo、Bar &バー)。
数日前にこの質問を投稿し、良い回答を得ましたが、より多くのサンプル データを使用していくつかのテストを行った結果、常に期待どおりに機能するとは限らないことがわかりました。
したがって、さらに検索した後、レーベンシュタイン関数を見つけたので、最初に完全一致をチェックし、見つからない場合は最も近い一致を見つけようとする組み合わせを行いました。さて、問題は、いくつかの列が似たような名前を持っていることです。Catlevel1、Catlevel2、...、Catlevel6。したがって、Catlevel2が欠落している場合、最後で最も類似した列であるCatlevel6と一致します。
これは私がこれまでに持っているものです:
foreach($all_columns as $i => $val1) {
$result = null;
// Search the second array for an exact match, if found
if(($found = array_search($val1,$_SESSION['found_columns'],true)) !==false) {
$result = $found;
} else {
// Otherwise, see if we can find a case-insensitive matching string
//where the element from $arr2 is found within the one from $arr1
foreach( $_SESSION['found_columns'] as $j => $val2) {
if($val1<>'' && $val2<>'') {
if( stripos( $val1, $val2) !== false ) {
$result = $j;
break;
} else {
$notfound .= $val1.', ';
break;
}
}
}
}
$_SESSION['found_column_positions'][$i] = $result;
}
/*****ALTERNATIVE METHOD USING levenshtein*****/
$i=0;
foreach($all_columns as $key => $value) {
$found = wordMatch($value, $arr2, 2);
$pos = array_search($found, $_SESSION['found_columns']);
$_SESSION['found_column_positions'][$i] = $pos;
$i++;
}
function wordMatch($input, $array, $sensitivity){
$words = $array;
$shortest = -1;
foreach ($words as $word) {
$lev = levenshtein($input, $word);
if ($lev == 0) {
$closest = $word;
$shortest = 0;
break;
}
if ($lev <= $shortest || $shortest < 0) {
$closest = $word;
$shortest = $lev;
}
}
if($shortest <= $sensitivity){
return $closest;
} else {
return 0;
}
}
2 つの配列を比較し、最も近い値の一致を見つけ、一致する値のキーを 3 番目の配列に保存して、2 つの配列間のキー参照として使用するより良い方法はありますか?