У меня есть строка
$descr = "Hello this is a test string";
То, что я пытаюсь сделать, состоит в том, чтобы разделить строку и сохранить каждое слово, которое разделено с использованием пространства в отдельный индекс массива в PHP. Должен ли я использовать
$myarray = preg_split("[\s]",$descr);
Ожидаемый результат:
$myarray(1) : hello $myarray(2) : this $myarray(3) : is $myarray(4) : a $myarray(5) : test $myarray(6) : string
Каждое число обозначает индекс массива
Вам нужно использовать explode (), как показано ниже:
$myarray = explode(' ', $descr); print_r($myarray);
Выход: – https://eval.in/847916
Чтобы повторно индексировать и вводить строчные буквы каждого слова в вашем массиве, выполните следующие действия: –
<?php $descr = "Hello this is a test string"; $myarray = explode(' ', $descr); $myarray = array_map('strtolower',array_combine(range(1, count($myarray)), array_values($myarray))); print_r($myarray);
Выход: – https://eval.in/847960
Чтобы узнать, сколько элементов в массиве:
echo count($myarray);
$descr = "Hello this is a test string"; $myarray = explode(' ', $descr);
Будет производить:
Array ( [0] => Hello [1] => this [2] => is [3] => a [4] => test [5] => string )
Используйте функцию разрыва, которая принимает разделитель как первый параметр и строковую переменную, которую вы хотите «взорвать» в качестве второго параметра. Каждое слово, разделенное отправленным разделителем, будет элементом в массиве.
Один из лучших способов – использовать str_word_count
print_r(str_word_count($descr , 1));
Этот вопрос требует поддержки задачи, состоящей из трех отдельных процедур.
Как разбить строку на пробелы для генерации массива слов? (У ОП есть субоптимальное, но работающее решение для этой части.)
/ /
. Это исключает проверку дополнительных символов пробела вне пространства. explode(' ',$descr)
будет самым популярным и интуитивно понятным вызовом функции. str_word_count($descr,1)
как указал Рави Хирани, также будет работать, но менее интуитивно понятен. Кроме того, важно отметить, что считается «словом»:
Для этой функции слово «слово» определяется как строка, зависящая от языка, содержащая алфавитные символы, которые также могут содержать, но не начинаться с символов «» и «-».
Как создать индексированный массив с ключами, начиная с 1 ?
$words=explode(' ',$descr); array_combine(range(1,count($words)),$words)
[0]
), затем удалите элемент с помощью функции, которая сохраняет ключи массива.
array_unshift($descr,''); unset($descr[0]);
array_unshift($descr,''); $descr=array_slice($descr,1,NULL,true);
lcfirst($descr)
будет работать в тестовом примере OP, потому что только первая буква первого слова заглавная. strtolower($descr)
является более надежным выбором, поскольку он изменяет целые строки на нижний регистр. mb_strtolower($descr)
если кодировка символов имеет значение. ucwords()
существует, но lcwords()
этого не делает. Существует так много путей к правильному результату для этого вопроса. Как вы определяете, какая из них «лучшая»? Первоочередной задачей должно быть Точность. Дальше должна быть эффективность / прямота. Далее следует некоторое соображение для читаемости. Код Brevity – это вопрос личного выбора и может столкнуться с читабельностью.
Учитывая эти соображения, я бы рекомендовал эти два метода:
Метод №1: (однострочный, 3-функции, новые переменные)
$descr="Hello this is a test string"; var_export(array_slice(explode(' ',' '.strtolower($descr)),1,null,true));
Метод № 2: (двухстрочный, 3-функции, одна новая переменная)
$descr="Hello this is a test string"; $array=explode(' ',' '.strtolower($descr)); unset($array[0]); var_export($array);
с$descr="Hello this is a test string"; $array=explode(' ',' '.strtolower($descr)); unset($array[0]); var_export($array);
Метод №2 должен выполняться быстрее, чем # 1, потому что unset()
является более легкой функцией, чем array_slice()
.
Объяснение для # 1. Преобразуйте полную строку ввода в нижний регистр и добавьте $descr
с пробелом. Пустое пространство вызовет функцию explode()
для создания дополнительного пустого элемента в начале выходного массива. array_slice()
сгенерированный массив, начиная с первого элемента (исключая нежелательный первый элемент).
Объяснение для # 2: то же, что и # 1, за исключением того, что он очищает первый элемент из сгенерированного массива с помощью unset()
. Хотя это быстрее, оно должно быть написано в отдельной строке.
Вывод любого из моих методов:
array ( 1 => 'hello', 2 => 'this', 3 => 'is', 4 => 'a', 5 => 'test', 6 => 'string', )
Связанный / ближний дубликат: