php - Compare arrays and search for matching values -
i have 2 arrays, $arr1
, $arr2
:
$arr1
list of columns expect read excel file, $arr2
array of columns found.
sometimes uploaded file contains
- misspelled column names
- columns in different order
- could missing columns
- also, column names might contain letters in different charset (ex. greek 'm' looks latin m cannot accounted same).
lets say, example, have following 2 arrays:
$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');
i need compare 2 arrays , save position of matching elements 3rd array:
$arr3 = ([0]=>0, [1]=>1, [2]=>3, [3]=>5, [4]=>6, [5]=>...);
displaying position of each matched element of $arr1
in $arr2
.
by 'matching' mean elements identical (ex. action), or partially same (ex. test & tes, ) , elements alike in different case (ex. foo & foo, bar & bar).
i posted this question few days ago , got answer after several tests more sample data i've found doesn't work expected.
so after more searching found levenshtein function did combination first checks exact match , if not found, tries find closest match. now, problem columns have similar names, ex. catlevel1, catlevel2,...,catlevel6. if catlevel2 missing, matched last & similar column catlevel6.
this have far:
foreach($all_columns $i => $val1) { $result = null; // search second array exact match, if found if(($found = array_search($val1,$_session['found_columns'],true)) !==false) { $result = $found; } else { // otherwise, see if can find case-insensitive matching string //where element $arr2 found within 1 $arr1 foreach( $_session['found_columns'] $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 $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 $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; } }
there better way compare 2 arrays, find closest value matches , save matching value key 3rd array use key reference between 2 arrays?
following script work.
<?php $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'); $arr3 = array(); foreach($arr1 $key=>$val) { $arr3[$key] = array_search($val, $arr2); } print_r($arr3); ?>
Comments
Post a Comment