Como aparar espaços em branco de valores de matriz em php

185

Eu tenho uma matriz da seguinte maneira

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

Eu quero uma matriz que contém os valores sem os espaços em branco em ambos os lados, mas pode conter valores vazios como fazer isso no php. A matriz de saída deve ser assim

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

Respostas:

486

array_map e trim podem fazer o trabalho

$trimmed_array = array_map('trim', $fruit);
print_r($trimmed_array);
Shakti Singh
fonte
4
Excelente. Muito mais simples do que usar array_walk ou um loop foreach
Ryan
10
Ravisoni, você mapeará essa função; array_map('rtrim', $fruit);. Espero que ajude :)
Jongosi
este é melhor $ fruit = array_map ('trim', $ fruit);
Yasar Arafath 18/03/19
1
O que acontece se uma das frutas é uma variedade de frutas exóticas?
Halfacht
@Halfacht isso não é uma função recursiva, você terá que escrever sua própria função recursiva neste caso
DarkMukke
7

array_walk()pode ser usado com trim()para aparar 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);

?>

Veja o segundo exemplo em http://www.php.net/manual/en/function.trim.php

Shiv Kumar Sah
fonte
2

Eu tive problemas com as respostas existentes ao usar matrizes multidimensionais. Esta solução funciona para mim.

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

Se a matriz for multidimensional, isso funcionará muito bem:

//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);
}

um teste de amostra é assim:

$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
fonte
2

Se você deseja aparar e imprimir uma matriz dimensional ou a dimensão mais profunda da matriz multidimensional, use:

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

Se você deseja aparar, mas não deseja imprimir uma matriz dimensional ou a dimensão mais profunda da matriz multidimensional, use:

$array = array_map('trim', $array);
Branimir Viljevac
fonte
2

Solução à prova multidimensional:

array_walk_recursive($array, function(&$arrValue, $arrKey){ $arrValue = trim($arrValue);});
Xenox
fonte
Obrigado! Confirmar isso também reduzirá o conteúdo aninhado e não os ignorará ou será definido comonull .
aexl 17/06
0
$fruit= array_map('trim', $fruit);
Shiv Kumar Sah
fonte
10
Esta é apenas uma repetição da resposta aceita .
Pang
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";

A saída do código acima é:

Mapa da matriz: 8.6775720119476 segundos
Caminhada da matriz: 10.423238992691 segundos
Foreach: 7.3502039909363 segundos
Para: 9.8266389369965 segundos

É claro que esses valores podem mudar, mas eu diria que é a melhor opção.

Jesus
fonte
Existe uma resposta para a pergunta original em todo esse código e texto?
18718 Chris K
0

array_map('trim', $data)converteria todos os subarrays em null. Se for necessário aparar espaços apenas para cadeias e deixar outros tipos como estão, você pode usar:

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

Apare no tipo de alteração array_map se você tiver um valor NULL.

Melhor maneira de fazer isso:

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

simplesmente você pode usar regex para aparar todos os espaços ou reduzir seus itens de matriz

$array = array_map(function ($item) {
    return preg_replace('/\s+/', '', $item);
}, $array);
Abolfazl Sharifi
fonte
-3
function trimArray(&$value) 
{ 
    $value = trim($value); 
}
$pmcArray = array('php ','mysql ', ' code ');
array_walk($pmcArray, 'trimArray');

usando a função array_walk, podemos remover o espaço dos elementos da matriz e os elementos retornam o resultado na mesma matriz.

Kamal
fonte