Як обрізати білі пробіли значень масиву у php


185

У мене є масив наступним чином

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

Я хочу масив, який містить значення без пробілів з обох сторін, але він може містити порожні значення, як це зробити у php.вихідний масив повинен бути таким

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

Відповіді:


486

array_map та обробка можуть виконати роботу

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

4
Відмінно. Набагато простіше, ніж використовувати array_walk або цикл foreach
Райан

10
ravisoni, ви б відобразили цю функцію; array_map('rtrim', $fruit);. Сподіваюся, це допомагає :)
Jongosi

цей краще $ фрукт = array_map ('обрізка', $ плід);
Ясар Арафат

1
Що станеться, якщо один із фруктів - це масив fe Exotic Fruits?
Halfacht

@Halfacht це не рекурсивна функція, у цьому випадку вам доведеться написати свою рекурсивну функцію
DarkMukke


2

У мене виникли проблеми з наявними відповідями при використанні багатовимірних масивів. Це рішення працює для мене.

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

2

Якщо масив багатовимірний, це буде чудово:

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

один зразок тесту такий:

$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

Якщо ви хочете обрізати та надрукувати одновимірний масив або найглибший вимір багатовимірного масиву, вам слід скористатися:

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

Якщо ви хочете обрізати, але не хочете друкувати одновимірний масив або найглибший розмір багатовимірного масиву, вам слід скористатися:

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

2

Різновимірне рішення:

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

Дякую! Підтвердивши це, фактично буде також обрізати вкладений вміст, а не проігнорувати їх і не встановитиnull .
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";

Вихід коду вище:

Карта масиву: 8.6775720119476 секунд
прогулянка масивом: 10.423238992691 секунд
Foreach: 7.3502039909363 секунд
За: 9.8266389369965 секунд

Ці значення, звичайно, можуть змінюватися, але я б сказав, що передбачення - найкращий варіант.


Чи є відповідь на початкове запитання у всьому цьому коді та тексті?
Кріс К

0

array_map('trim', $data)перетворив би всі підрядні масиви в null. Якщо потрібно обрізати пробіли лише для рядків і залишити інші типи такими, якими вони є, ви можете використовувати:

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

0

Обріжте тип зміни array_map, якщо у вас є значення NULL.

Кращий спосіб зробити це:

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

0

просто ви можете використовувати регулярний вираз, щоб обрізати всі пробіли або мінімізувати елементи масиву

$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');

за допомогою функції array_walk ми можемо видалити простір з елементів масиву, а елементи повернуть результат у тому ж масиві.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.