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

Popular posts from this blog

linux - xterm copying to CLIPBOARD using copy-selection causes automatic updating of CLIPBOARD upon mouse selection -

c++ - qgraphicsview horizontal scrolling always has a vertical delta -