Cómo recortar espacios en blanco de valores de matriz en php


185

Tengo una matriz de la siguiente manera

$fruit = array('  apple ','banana   ', ' , ',     '            cranberry ');

Quiero una matriz que contenga los valores sin los espacios en blanco en ambos lados, pero puede contener valores vacíos sobre cómo hacer esto en php. La matriz de salida debería ser así

$fruit = array('apple','banana', ',', 'cranberry');

Respuestas:


486

array_map y trim pueden hacer el trabajo

$trimmed_array = array_map('trim', $fruit);
print_r($trimmed_array);

44
Excelente. Mucho más simple que usar array_walk o un bucle foreach
Ryan

10
ravisoni, mapearías esa función; array_map('rtrim', $fruit);. Espero que ayude :)
Jongosi

este mejor $ fruit = array_map ('trim', $ fruit);
Yasar Arafath

1
¿Qué sucede si una de las frutas es una variedad de frutas exóticas?
Halfacht

@Halfacht esta no es una función recursiva, en este caso tendrá que escribir su propia función recursiva
DarkMukke

7

array_walk()se puede usar trim()para recortar la matriz

<?php
function trim_value(&$value) 
{ 
    $value = trim($value); 
}

$fruit = array('apple','banana ', ' cranberry ');
var_dump($fruit);

array_walk($fruit, 'trim_value');
var_dump($fruit);

?>

Ver segundo ejemplo en http://www.php.net/manual/en/function.trim.php


2

Tuve problemas con las respuestas existentes al usar matrices multidimensionales. Esta solución me funciona.

if (is_array($array)) {
    foreach ($array as $key => $val) {
        $array[$key] = trim($val);
    }
}

2

Si la matriz es multidimensional, esto funcionará muy bien:

//trims empty spaces in array elements (recursively trim multidimesional arrays)
function trimData($data){
   if($data == null)
       return null;

   if(is_array($data)){
       return array_map('trimData', $data);
   }else return trim($data);
}

Una prueba de muestra es así:

$arr=[" aaa ", " b  ", "m    ", ["  .e  ", "    12 3", "9 0    0 0   "]];
print_r(trimData($arr));
//RESULT
//Array ( [0] => aaa [1] => b [2] => m [3] => Array ( [0] => .e [1] => 12 3 [2] => 9 0 0 0 ) )

2

Si desea recortar e imprimir una matriz unidimensional o la dimensión más profunda de la matriz multidimensional, debe usar:

foreach($array as $key => $value)
{
    $array[$key] = trim($value);
    print("-");
    print($array[$key]);
    print("-");
    print("<br>");
}

Si desea recortar pero no desea imprimir una matriz unidimensional o la dimensión más profunda de la matriz multidimensional, debe usar:

$array = array_map('trim', $array);

2

Solución a prueba multidimensional:

array_walk_recursive($array, function(&$arrValue, $arrKey){ $arrValue = trim($arrValue);});

¡Gracias! Al confirmar esto, también se recortarán los contenidos anidados y no se ignorarán ni se establecerán ennull .
aexl


0
function generateRandomString($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

function generateRandomSpaces() {
    $output = '';
    $i = rand(1, 10);
    for ($j = 0; $j <= $i; $j++) {
        $output .= " ";
    }   

    return $output;
}

// Generating an array to test
$array = [];
for ($i = 0; $i <= 1000; $i++) {
    $array[] = generateRandomSpaces() . generateRandomString(10) . generateRandomSpaces(); 
}

// ARRAY MAP
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
    $trimmed_array=array_map('trim',$array);
}
$time = (microtime(true) - $start);
echo "Array map: " . $time . " seconds\n";

// ARRAY WALK
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
    array_walk($array, 'trim');
}
$time = (microtime(true) - $start);
echo "Array walk    : " . $time . " seconds\n"; 

// FOREACH
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
    foreach ($array as $index => $elem) {
        $array[$index] = trim($elem);
    }
}
$time = (microtime(true) - $start);
echo "Foreach: " . $time . " seconds\n";

// FOR
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
    for ($j = 0; $j < count($array) - 1; $j++) { 
        $array[$j] = trim($array[$j]);
    }
}
$time = (microtime(true) - $start);
echo "For: " . $time . " seconds\n";

La salida del código anterior es:

Mapa de matriz: 8.6775720119476 segundos
Caminata de matriz: 10.423238992691 segundos
Foreach: 7.3502039909363 segundos
Por: 9.8266389369965 segundos

Estos valores, por supuesto, pueden cambiar, pero yo diría que foreach es la mejor opción.


¿Hay una respuesta a la pregunta original en todo este código y texto?
Chris K

0

array_map('trim', $data)convertiría todas las submatrices en null. Si es necesario recortar espacios solo para cadenas y dejar otros tipos como están, puede usar:

$data = array_map(
    function ($item) {
        return is_string($item) ? trim($item) : $item;
    },
    $data
);

0

Recorte en el tipo de cambio array_map si tiene un valor NULL.

Mejor forma de hacerlo:

$result = array_map(function($v){ 
  return is_string($v)?trim($v):$v; 
}, $array);

0

simplemente puede usar expresiones regulares para recortar todos los espacios o minimizar sus elementos de matriz

$array = array_map(function ($item) {
    return preg_replace('/\s+/', '', $item);
}, $array);

-3
function trimArray(&$value) 
{ 
    $value = trim($value); 
}
$pmcArray = array('php ','mysql ', ' code ');
array_walk($pmcArray, 'trimArray');

Al usar la función array_walk, podemos eliminar el espacio de los elementos de la matriz y los elementos devuelven el resultado en la misma matriz.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.