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');
n92
fuente

Respuestas:

486

array_map y trim pueden hacer el trabajo

$trimmed_array = array_map('trim', $fruit);
print_r($trimmed_array);
Shakti Singh
fuente
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

Shiv Kumar Sah
fuente
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);
    }
}
ganso
fuente
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 ) )
Elnoor
fuente
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);
Branimir Viljevac
fuente
2

Solución a prueba multidimensional:

array_walk_recursive($array, function(&$arrValue, $arrKey){ $arrValue = trim($arrValue);});
Xenox
fuente
¡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.

Jesús
fuente
¿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
);
Aistis
fuente
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);
Piotr Nowak
fuente
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);
Abolfazl Sharifi
fuente
-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.

Kamal
fuente