Объединить строки из массива в PHP, игнорируя пробелы - PullRequest
0 голосов
/ 20 февраля 2020

Похоже на на этот вопрос , но на PHP. Я хочу объединить массив строк, но игнорировать пробелы.

Например, предположим, что я хочу построить атрибут full_name в Laravel, используя $this->title, $this->first_name и $this->last_name, каждый разделены одним пробелом. Самая простая мысль, которую я имел, состояла в том, чтобы собрать их все в массив и передать в implode(), как показано ниже:

implode(' ', [$this->title, $this->first_name, $this->last_name]);

Однако я не знаю, являются ли эти значения на самом деле будет установлен или нет. И если они установлены, я не хочу, чтобы пустые строки загрязняли вывод множественными пробелами между непустыми элементами. Есть ли встроенная функция или, по крайней мере, более простой / короткий способ сделать следующее?

public function concatenateStringsFromArray($glue = ' ', $arrayOfStrings)
{
    $result = '';
    foreach($arrayOfStrings as $piece)
        $result .= isset($piece) ? $piece . $glue : '';
    return $result;
}

Ответы [ 4 ]

2 голосов
/ 20 февраля 2020

array_map с функцией trim в качестве функции удаляет все пробелы в начале и конце строки, а не в середине. Затем array_filter удаляет все пустые элементы, включая ноль и "".

$arrayOfStrings = ['a', 'b    c',null, '    ','ef ','  012'];

$result = implode(' ', array_filter(array_map('trim',$arrayOfStrings)));

echo '<pre>'.$result;  //a b    c ef 012

Я написал все в одну строку, потому что вы хотели, чтобы оно было коротким.

1 голос
/ 20 февраля 2020

Применение функции trim() к каждому элементу массива. См. Следующий пример:

<?php

$arrayOfStrings = ['a', ' b c',null, ' ','def '];

echo implode(' ', array_filter($arrayOfStrings, function($element) { 
    return trim($element); 
}));

Код выше выводит "a b c def ". Обратите внимание на пробел после "def ".

Это означает, что функция trim() с функцией обратного вызова array_filter() не обрезает пространство с правой стороны . Чтобы решить эту проблему, вы должны использовать функцию trim() с функциями array_filter() и array_map(). Потому что функция array_map() удаляет пробелы с обеих сторон. См. Следующий пример:

<?php

echo implode(' ', array_filter(array_map('trim', $arrayOfStrings)));

Код выше выводит "a b c def"

Кстати, благодаря @jspit за хороший улов!

0 голосов
/ 20 февраля 2020

array_filter() должны сделать свое дело. Простой вызов implode($glue,array_filter($array)) должен дать вам то, что вы хотите, отфильтровывая все элементы данного массива, которые разрешаются в false (0, ноль и '' среди других). Если вам нужны 0 или другие значения, которые в качестве допустимых значений принимают логическое значение false, вы можете использовать пользовательский обратный вызов:

array_filter($array, function($value) { return !is_null($value) && $value !== ''; })
0 голосов
/ 20 февраля 2020

Адаптировано из примера с использованием array_filter:

return implode($glue, array_filter($arrayOfStrings, function($element) { 
    return $element !== null && $element !== ''; 
}));
...