Обработка строк через преобразование в массив — PHP: Массивы
Решить эту задачу можно множеством способов — чем больше назовете, тем лучше. Есть как минимум три варианта:
- Посимвольный перебор строки. Есть два способа перебора, в том числе конечные автоматы, которые мы рассмотрим в отдельном курсе
- Регулярные выражения, о них тоже есть отдельный курс
- Преобразование строки в массив слов
Рассмотрим последний способ. Первым делом нужно превратить строку в массив. Для этого мы воспользуемся функцией explode() , которая разделяет строку, используя указанный разделитель. В нашем случае разделитель — это пробел:
function capitalizeWords($sentence) $words = explode(' ', $sentence); // . >
Теперь можно использовать цикл и выполнить операцию capitalize, то есть привести первую букву каждого слова к верхнему регистру:
function capitalizeWords($sentence) $words = explode(' ', $sentence); $capitalizedWords = []; foreach ($words as $word) $capitalizedWords[] = ucfirst($word); > // . >
Последнее действие обратно первому — нужно соединить слова и вернуть получившуюся строку наружу. Чтобы соединить элементы массива, воспользуемся функцией implode() . Как и explode() , она принимает на вход разделитель, который теперь используется для сборки строки:
function capitalizeWords($sentence) $words = explode(' ', $sentence); $capitalizedWords = []; foreach ($words as $word) $capitalizedWords[] = ucfirst($word); > return implode(' ', $capitalizedWords); > $greeting = 'hello from Malasia'; print_r(capitalizeWords($greeting)); // => Hello From Malasia
Если строку нужно разбить по символам, а не по словам, можно воспользоваться функцией mb_str_split() :
$chars = mb_str_split($text); foreach ($chars as $char) print_r($char); >
Функция mb_str_split() принимает второй параметр, в котором можно указать количество символов в каждой группе (в каждом элементе получившегося массива). Значение по умолчанию равно единице, поэтому мы получаем массив, в котором каждый элемент — это один символ. Например, если мы захотим указать число 3, то в каждом элементе массива будет по три символа:
$text = 'Hello Friend'; $parts = mb_str_split($text, 3); print_r($parts); // => Array // => ( // => [0] => Hel // => [1] => lo // => [2] => Fri
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
str_split
Если указан необязательный параметр length , возвращаемый массив будет разбит на фрагменты, каждый из которых будет иметь длину length , за исключением последнего фрагмента, который может быть короче, если строка делится неравномерно. По умолчанию параметр length равен 1 , то есть размер каждого фрагмента будет один байт.
Ошибки
Если параметр length меньше 1 , будет выброшена ошибка ValueError .
Список изменений
| Версия | Описание |
|---|---|
| 8.2.0 | Если параметр string не задан, теперь возвращается пустой массив ( array ). Ранее возвращался массив ( array ), содержащий одну пустую строку |
| 8.0.0 | Теперь если параметр length меньше 1 , будет выброшена ошибка ValueError ; ранее, вместо этого выдавалась ошибка уровня E_WARNING , а функция возвращала false . |
Примеры
Пример #1 Пример использования функции str_split()
$str = «Hello Friend» ;
$arr1 = str_split ( $str );
$arr2 = str_split ( $str , 3 );
print_r ( $arr1 );
print_r ( $arr2 );
Результат выполнения этого примера:
Array ( [0] => H [1] => e [2] => l [3] => l [4] => o [5] => [6] => F [7] => r [8] => i [9] => e [10] => n [11] => d ) Array ( [0] => Hel [1] => lo [2] => Fri [3] => end )
Примечания
Замечание:
Функция str_split() производит разбивку по байтам, а не по символам, в случае использования строк в многобайтных кодировках. Используйте функцию mb_str_split() , чтобы разбить строку на кодовые точки.
Смотрите также
- mb_str_split() — Если задана многобайтовая строка возвращает массив символов
- chunk_split() — Разбивает строку на фрагменты
- preg_split() — Разбивает строку по регулярному выражению
- explode() — Разбивает строку с помощью разделителя
- count_chars() — Возвращает информацию о символах, входящих в строку
- str_word_count() — Возвращает информацию о словах, входящих в строку
- for
User Contributed Notes 3 notes
10 months ago
The function str_split() is not ‘aware’ of words. Here is an adaptation of str_split() that is ‘word-aware’.
$array = str_split_word_aware (
‘In the beginning God created the heaven and the earth. And the earth was without form, and void; and darkness was upon the face of the deep.’ ,
32
);
/**
* This function is similar to str_split() but this function keeps words intact; it never splits through a word.
*
* @return array
*/
function str_split_word_aware ( string $string , int $maxLengthOfLine ): array
if ( $maxLengthOfLine <= 0 ) throw new RuntimeException ( sprintf ( 'The function %s() must have a max length of line at least greater than one' , __FUNCTION__ ));
>
$lines = [];
$words = explode ( ‘ ‘ , $string );
$currentLine = » ;
$lineAccumulator = » ;
foreach ( $words as $currentWord )
$currentWordWithSpace = sprintf ( ‘%s ‘ , $currentWord );
$lineAccumulator .= $currentWordWithSpace ;
if ( strlen ( $lineAccumulator ) < $maxLengthOfLine ) $currentLine = $lineAccumulator ;
continue;
>
// Overwrite the current line and accumulator with the current word
$currentLine = $currentWordWithSpace ;
$lineAccumulator = $currentWordWithSpace ;
>
if ( $currentLine !== » ) $lines [] = $currentLine ;
>
array( 5 ) [ 0 ]=> string ( 29 ) «In the beginning God created »
[ 1 ]=> string ( 30 ) «the heaven and the earth. And »
[ 2 ]=> string ( 28 ) «the earth was without form, »
[ 3 ]=> string ( 27 ) «and void; and darkness was »
[ 4 ]=> string ( 27 ) «upon the face of the deep. »
>
explode
Возвращает массив строк, полученных разбиением строки string с использованием separator в качестве разделителя.
Список параметров
Если аргумент limit является положительным, возвращаемый массив будет содержать максимум limit элементов, при этом последний элемент будет содержать остаток строки string .
Если параметр limit отрицателен, то будут возвращены все компоненты, кроме последних — limit .
Если limit равен нулю, то он расценивается как 1.
Замечание:
До PHP 8.0 функция implode() принимала параметры в любом порядке. Функция explode() никогда этого не поддерживала: убедитесь в том, что separator указан перед аргументом string .
Возвращаемые значения
Возвращает массив ( array ) строк ( string ), созданный делением параметра string по границам, указанным параметром separator .
Если separator является пустой строкой («»), explode() выбрасывает ValueError . Если separator не содержится в string , и используется отрицательный limit , то будет возвращён пустой массив ( array ), иначе будет возвращён массив, содержащий string . Если значения separator появляются в начале или в конце string , указанные значения будут добавлены как пустое значение массива ( array ), либо в первой, либо в последней позиции возвращённого массива ( array ) соответственно.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 | explode() теперь выбрасывает TypeError , если параметр separator является пустой строкой ( «» ). Ранее вместо исключения explode() возвращала false . |
Примеры
Пример #1 Пример использования explode()
// Пример 1
$pizza = «кусок1 кусок2 кусок3 кусок4 кусок5 кусок6» ;
$pieces = explode ( » » , $pizza );
echo $pieces [ 0 ]; // кусок1
echo $pieces [ 1 ]; // кусок2
?php
// Пример 2
$data = «foo:*:1023:1000::/home/foo:/bin/sh» ;
list( $user , $pass , $uid , $gid , $gecos , $home , $shell ) = explode ( «:» , $data );
echo $user ; // foo
echo $pass ; // *
Пример #2 Пример возвращаемого значения explode()
/*
Строка, которая не содержит разделителя, будет
просто возвращать массив с одним значением оригинальной строки.
*/
$input1 = «hello» ;
$input2 = «hello,there» ;
$input3 = ‘,’ ;
var_dump ( explode ( ‘,’ , $input1 ) );
var_dump ( explode ( ‘,’ , $input2 ) );
var_dump ( explode ( ‘,’ , $input3 ) );
?php
Результат выполнения этого примера:
array(1) ( [0] => string(5) "hello" ) array(2) ( [0] => string(5) "hello" [1] => string(5) "there" ) array(2) ( [0] => string(0) "" [1] => string(0) "" )
Пример #3 Примеры с использованием параметра limit
// положительный лимит
print_r ( explode ( ‘|’ , $str , 2 ));
// отрицательный лимит
print_r ( explode ( ‘|’ , $str , — 1 ));
?>
Результат выполнения этого примера:
Array ( [0] => один [1] => два|три|четыре ) Array ( [0] => один [1] => два [2] => три )
Примечания
Замечание: Эта функция безопасна для обработки данных в двоичной форме.
Смотрите также
- preg_split() — Разбивает строку по регулярному выражению
- str_split() — Преобразовывает строку в массив
- mb_split() — Разделение строк в многобайтных кодировках, используя регулярное выражение
- str_word_count() — Возвращает информацию о словах, входящих в строку
- strtok() — Разбивает строку на токены
- implode() — Объединяет элементы массива в строку
User Contributed Notes 4 notes
1 year ago
Note that an empty input string will still result in one element in the output array. This is something to remember when you are processing unknown input.
For example, maybe you are splitting part of a URI by forward slashes (like «articles/42/show» => [«articles», «42», «show»]). And maybe you expect that an empty URI will result in an empty array («» => []). Instead, it will contain one element, with an empty string:
$uri = » ;
$parts = explode ( ‘/’ , $uri );
var_dump ( $parts );
2 years ago
Be careful, while most non-alphanumeric data types as input strings return an array with an empty string when used with a valid separator, true returns an array with the string «1»!
var_dump(explode(‘,’, null)); //array(1) < [0]=>string(0) «» >
var_dump(explode(‘,’, false)); //array(1) < [0]=>string(0) «» >
var_dump(explode(‘,’, true)); //array(1) < [0]=>string(1) «1» >
1 month ago
If your data is smaller than the expected count with the list expansion:
$data = «foo:*:1023:1000::/home/foo:/bin/sh» ;
list( $user , $pass , $uid , $gid , $gecos , $home , $shell , $nu ) = explode ( «:» , $data );
?>
The result is a warning not an error:
PHP Warning: Undefined array key 7 in .
The solution is to pad the array to the expected length:
$data = «foo:*:1023:1000::/home/foo:/bin/sh» ;
list( $user , $pass , $uid , $gid , $gecos , $home , $shell , $nu ) = array_pad ( explode ( «:» , $data ), 8 , «» );
// where 8 is the count of the list arguments
?>
1 year ago
If you want to directly take a specific value without having to store it in another variable, you can implement the following:
echo $status_only = explode(‘-‘, $status)[0];
- Copyright © 2001-2024 The PHP Group
- My PHP.net
- Contact
- Other PHP.net sites
- Privacy policy
Преобразование строк в массив PHP
Примеры преобразования строк текста в массив по разным разделителям.
Разделить текст по переносам строк
$text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin blandit magna eu tempus ullamcorper. Sed porta justo sed nibh elementum condimentum. Quisque non eros sit amet elit commodo maximus eget a eros."; $array = explode("\n", $text); print_r($array);
Результат:
Array ( [0] => Lorem ipsum dolor sit amet, consectetur adipiscing elit. [1] => Proin blandit magna eu tempus ullamcorper. [2] => Sed porta justo sed nibh elementum condimentum. [3] => Quisque non eros sit amet elit commodo maximus eget a eros. )
Разделить текст по предложениям
$text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin blandit magna eu tempus ullamcorper! Sed porta justo sed nibh elementum condimentum. Quisque non eros sit amet elit commodo maximus eget a eros?"; $text = str_replace("\n", '', $text); $array = preg_split('/(?<=[. ])\s+(?=[a-zа-яё])/i', $text); print_r($array);
Результат:
Array ( [0] => Lorem ipsum dolor sit amet, consectetur adipiscing elit. [1] => Proin blandit magna eu tempus ullamcorper! [2] => Sed porta justo sed nibh elementum condimentum. [3] => Quisque non eros sit amet elit commodo maximus eget a eros? )
Разделить текст по словам
$text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin blandit magna eu tempus ullamcorper."; $text = preg_replace("/[^a-zа-яё0-9\s]/i", '', $text); $array = preg_split('/(\s)/', $text); $array = array_diff($array, array('')); print_r($array);
Результат:
Array ( [0] => Lorem [1] => ipsum [2] => dolor [3] => sit [4] => amet [5] => consectetur [6] => adipiscing [7] => elit [8] => Proin [9] => blandit [10] => magna [11] => eu [12] => tempus [13] => ullamcorper )
Разделить текст по буквам
$text = "Lorem ipsum dolor sit amet"; $array = str_split($text); print_r($array);
Результат:
Array ( [0] => L [1] => o [2] => r [3] => e [4] => m [5] => [6] => i [7] => p [8] => s [9] => u [10] => m [11] => [12] => d [13] => o [14] => l [15] => o [16] => r [17] => [18] => s [19] => i [20] => t [21] => [22] => a [23] => m [24] => e [25] => t )
Разделить текст по нескольким разделителям
$text = "Lorem ipsum dolor sit amet-proin blandit magna eu:Sed porta justo."; $array = preg_split('/[-|:]/u', $text, -1, PREG_SPLIT_NO_EMPTY); print_r($array);
Результат:
Array ( [0] => Lorem ipsum dolor sit amet [1] => proin blandit magna eu [2] => Sed porta justo. )
Если разделитель из нескольких символов, например
и :
$text = "Lorem ipsum dolor sit amet,
proin blandit magna eu.Sed porta justo."; $array = preg_split('/(
)|()/u', $text, -1, PREG_SPLIT_NO_EMPTY); print_r($array);
Результат:
Array ( [0] => Lorem ipsum dolor sit amet, [1] => proin blandit magna eu. [2] => Sed porta justo. )
Разделить текст на равные части
$text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin blandit magna eu tempus ullamcorper."; $chunks = 10; $array = str_split($text); $chunks = array_chunk($array, $chunks, false); $result = array(); foreach ($chunks as $chunk) < $result[] = implode($chunk); >print_r($result);
Результат:
Array ( [0] => Lorem ipsu [1] => m dolor si [2] => t amet, co [3] => nsectetur [4] => adipiscing [5] => elit. Pro [6] => in blandit [7] => magna eu [8] => tempus ull [9] => amcorper. )
27.12.2020, обновлено 05.04.2022