Skip to content

Instantly share code, notes, and snippets.

@oreales
Created November 5, 2013 19:38
Show Gist options
  • Save oreales/7324849 to your computer and use it in GitHub Desktop.
Save oreales/7324849 to your computer and use it in GitHub Desktop.
funcione que busca la string que viene como parametro en un array de strings normalizados y devuelve la que es más coincidente
<?php
/**
*
* Funcion que devuelve la cadena mas parecida encontrada en un array
* @param string $string cadena a sustituir
* @param array $values valores en los que buscar la cadena más parecido a la cadena pasada
* @param int $acceptanceLevel si nivel de aceptacion es mayor mejora el rendiemiento pero empeora los resultados.
* si nivel de aceptacion es 0, no se para hasta encontrar una cadena exacta o el fin del array.
* si nivel de aceptacion es > 0, en cuanto encuentre una cadena con ese nivel de aceptacion devuelve el resultado
* sin analizar posteriores valores en el array de values
*/
public function findClosestStringInArray($string, $values, $acceptanceLevel = 0)
{
$string = strtolower($string);
$lowest = -1;
$closest = current($values);
foreach($values as $value)
{
$similitud = levenshtein($string, strtolower($value));
if($similitud <= $acceptanceLevel)
{
return $value;
}
elseif($lowest == -1 || $similitud < $lowest)
{
$lowest = $similitud;
$closest = $value;
}
}
return $closest;
}
@oreales
Copy link
Author

oreales commented Nov 5, 2013

Uso esta funcion algunas veces en Magento para, dada un REGION NAME que no coincide con los nombres de regiones normalizados en Magento, poder encontrar cual es la region de Magento que MAS coincide con la region no normalizada que nos pasan. Esto ocurre muchas veces porque en un ERP externo las regiones tienen otras nomenclaturas diferentes a Magento y hay que "mapearlas" dinamicamente. En ese caso, coloco la funcion anterior en un helper de Magento y la invoco de forma similar a esta:

$validRegion = Mage::helper('mymodule')->findClosestStringInArray($regionNameFromSAP, $regionsArrayFromMagento);

Siendo:
$regionNameFromSAP = nombre que de region que tienes en SAP y que no hace matching con una region en Magento
$regionsArrayFromMagento = array con los region names contra los que comparar el $regionNameFromSAP

Funciona bastante bien, aunque depende mucho de las cadenas de entrada que se tengan. Espero que os sea de ayuda.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment