ultimo - strpos php
Función in_array insensible a mayúsculas y minúsculas de PHP (9)
¿Es posible hacer una comparación de mayúsculas y minúsculas al usar la función in_array
?
Entonces con una matriz fuente como esta:
$a= array(
''one'',
''two'',
''three'',
''four''
);
Las siguientes búsquedas serían todas verdaderas:
in_array(''one'', $a);
in_array(''two'', $a);
in_array(''ONE'', $a);
in_array(''fOUr'', $a);
¿Qué función o conjunto de funciones harían lo mismo? No creo que in_array
sí mismo pueda hacer esto.
Escribí una función simple para verificar si hay un valor insensible en una matriz, el código está debajo.
función:
function in_array_insensitive($needle, $haystack) {
$needle = strtolower($needle);
foreach($haystack as $k => $v) {
$haystack[$k] = strtolower($v);
}
return in_array($needle, $haystack);
}
cómo utilizar:
$array = array(''one'', ''two'', ''three'', ''four'');
var_dump(in_array_insensitive(''fOUr'', $array));
Lo anterior es correcto si suponemos que las matrices solo pueden contener cadenas, pero las matrices también pueden contener otras matrices. También la función in_array () puede aceptar una matriz para $ needle, por lo que strtolower ($ needle) no funcionará si $ needle es una matriz y array_map (''strtolower'', $ haystack) no va a funcionar si $ haystack contiene otra arrays, pero dará como resultado "Advertencia PHP: strtolower () espera que el parámetro 1 sea string, array dado".
Ejemplo:
$needle = array(''p'', ''H'');
$haystack = array(array(''p'', ''H''), ''U'');
Así que creé una clase de ayuda con los métodos relevantes, para hacer controles in_array () insensibles a mayúsculas y minúsculas (mayúsculas y minúsculas). También estoy usando mb_strtolower () en lugar de strtolower (), por lo que se pueden usar otras codificaciones. Aquí está el código:
class StringHelper {
public static function toLower($string, $encoding = ''UTF-8'')
{
return mb_strtolower($string, $encoding);
}
/**
* Digs into all levels of an array and converts all string values to lowercase
*/
public static function arrayToLower($array)
{
foreach ($array as &$value) {
switch (true) {
case is_string($value):
$value = self::toLower($value);
break;
case is_array($value):
$value = self::arrayToLower($value);
break;
}
}
return $array;
}
/**
* Works like the built-in PHP in_array() function — Checks if a value exists in an array, but
* gives the option to choose how the comparison is done - case-sensitive or case-insensitive
*/
public static function inArray($needle, $haystack, $case = ''case-sensitive'', $strict = false)
{
switch ($case) {
default:
case ''case-sensitive'':
case ''cs'':
return in_array($needle, $haystack, $strict);
break;
case ''case-insensitive'':
case ''ci'':
if (is_array($needle)) {
return in_array(self::arrayToLower($needle), self::arrayToLower($haystack), $strict);
} else {
return in_array(self::toLower($needle), self::arrayToLower($haystack), $strict);
}
break;
}
}
}
Lo más obvio es convertir el término de búsqueda a minúsculas:
if (in_array(strtolower($word), $a) {
...
por supuesto, si hay letras en mayúsculas en la matriz, tendrá que hacer esto primero:
$search_array = array_map(''strtolower'', $a);
y busca eso. No tiene sentido hacer strtolower
en toda la matriz con cada búsqueda.
Sin embargo, la búsqueda de matrices es lineal. Si tiene una matriz grande o va a hacer esto mucho, sería mejor poner los términos de búsqueda en la clave de la matriz, ya que este será un acceso mucho más rápido:
$search_array = array_combine(array_map(''strtolower'', $a), $a);
entonces
if ($search_array[strtolower($word)]) {
...
El único problema aquí es que las claves de matriz deben ser únicas, por lo que si tiene una colisión (por ejemplo, "Uno" y "uno") perderá todas menos una.
Supongamos que desea utilizar el comando in_array, así es cómo puede hacer que la búsqueda sea insensible.
Insensible a mayúsculas / minúsculas ():
foreach($searchKey as $key => $subkey) {
if (in_array(strtolower($subkey), array_map("strtolower", $subarray)))
{
echo "found";
}
}
Sensible a mayúsculas
foreach($searchKey as $key => $subkey) {
if (in_array("$subkey", $subarray))
{
echo "found";
}
}
puedes usar preg_grep()
:
$a= array(
''one'',
''two'',
''three'',
''four''
);
print_r( preg_grep( "/ONe/i" , $a ) );
$a = [1 => ''funny'', 3 => ''meshgaat'', 15 => ''obi'', 2 => ''OMER''];
$b = ''omer'';
function checkArr($x,$array)
{
$arr = array_values($array);
$arrlength = count($arr);
$z = strtolower($x);
for ($i = 0; $i < $arrlength; $i++) {
if ($z == strtolower($arr[$i])) {
echo "yes";
}
}
};
checkArr($b, $a);
function in_arrayi($needle, $haystack) {
return in_array(strtolower($needle), array_map(''strtolower'', $haystack));
}
De la Documentation
function in_arrayi($needle, $haystack) {
return in_array(strtolower($needle), array_map(''strtolower'', $haystack));
}
- in_array acepta estos parámetros: in_array (search, array, type)
- si el parámetro de búsqueda es una cadena y el parámetro de tipo está establecido en VERDADERO, la búsqueda distingue entre mayúsculas y minúsculas.
- así que para hacer que la búsqueda ignore el caso, sería suficiente usarlo así:
$ a = array (''uno'', ''dos'', ''tres'', ''cuatro'');
$ b = in_array (''ONE'', $ a, falso);