Обработка строк через преобразование в массив — 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
11 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. »
>
Преобразование строк в массив 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
implode
Альтернативная сигнатура (не поддерживается с именованными аргументами):
implode ( array $array ): string
Устаревшая сигнатура (устарела с PHP 7.4.0, удалена в PHP 8.0.0):
implode ( array $array , string $separator ): string
Объединяет элементы массива с помощью строки separator .
Список параметров
Необязательный. По умолчанию равен пустой строке.
Массив объединяемых строк.
Возвращаемые значения
Возвращает строку, содержащую строковое представление всех элементов массива в указанном порядке, с разделителем между каждым элементом.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 | Передача separator после array больше не поддерживается. |
| 7.4.0 | Передача separator после array (т.е. использование недокументированного порядка параметров) устарела. |
Примеры
Пример #1 Пример использования implode()
$array = [ 'имя' , 'почта' , 'телефон' ];
var_dump ( implode ( "," , $array )); // string(32) "имя,почта,телефон"
// Пустая строка при использовании пустого массива:
var_dump ( implode ( 'привет' , [])); // string(0) ""
// Параметр separator не обязателен:
var_dump ( implode ([ 'a' , 'b' , 'c' ])); // string(3) "abc"
Примечания
Замечание: Эта функция безопасна для обработки данных в двоичной форме.
Смотрите также
- explode() - Разбивает строку с помощью разделителя
- preg_split() - Разбивает строку по регулярному выражению
- http_build_query() - Генерирует URL-кодированную строку запроса
User Contributed Notes 14 notes
14 years ago
it should be noted that an array with one or no elements works fine. for example:
$a1 = array( "1" , "2" , "3" );
$a2 = array( "a" );
$a3 = array();
echo "a1 is: '" . implode ( "','" , $a1 ). "'
" ;
echo "a2 is: '" . implode ( "','" , $a2 ). "'
" ;
echo "a3 is: '" . implode ( "','" , $a3 ). "'
" ;
?>
will produce:
===========
a1 is: '1','2','3'
a2 is: 'a'
a3 is: ''
5 years ago
It's not obvious from the samples, if/how associative arrays are handled. The "implode" function acts on the array "values", disregarding any keys:
declare( strict_types = 1 );
$a = array( 'one' , 'two' , 'three' );
$b = array( '1st' => 'four' , 'five' , '3rd' => 'six' );
echo implode ( ',' , $a ), '/' , implode ( ',' , $b );
?>
outputs:
one,two,three/four,five,six
10 years ago
Can also be used for building tags or complex lists, like the following:
$elements = array( 'a' , 'b' , 'c' );
- " . implode ( "
- " , $elements ) . "
?>
This is just an example, you can create a lot more just finding the right glue! 😉
7 years ago
It might be worthwhile noting that the array supplied to implode() can contain objects, provided the objects implement the __toString() method.
class Foo
protected $title ;
public function __construct ( $title )
$this -> title = $title ;
>
public function __toString ()
return $this -> title ;
>
>
$array = [
new Foo ( 'foo' ),
new Foo ( 'bar' ),
new Foo ( 'qux' )
];
echo implode ( '; ' , $array );
?>
will output:
12 years ago
If you want to implode an array of booleans, you will get a strange result:
var_dump ( implode ( '' ,array( true , true , false , false , true )));
?>
Output:
string(3) "111"
TRUE became "1", FALSE became nothing.
3 years ago
If you want to implode an array as key-value pairs, this method comes in handy.
The third parameter is the symbol to be used between key and value.
function mapped_implode ( $glue , $array , $symbol = '=' ) return implode ( $glue , array_map (
function( $k , $v ) use( $symbol ) <
return $k . $symbol . $v ;
>,
array_keys ( $array ),
array_values ( $array )
)
);
>
echo mapped_implode ( ', ' , $arr , ' is ' );
// output: x is 5, y is 7, z is 99, hello is World, 7 is Foo
2 years ago
Sometimes it's necessary to add a string not just between the items, but before or after too, and proper handling of zero items is also needed.
In this case, simply prepending/appending the separator next to implode() is not enough, so I made this little helper function.
function wrap_implode ( $array , $before = '' , $after = '' , $separator = '' ) if( ! $array ) return '' ;
return $before . implode ( " < $after >< $separator > < $before >" , $array ) . $after ;
>
echo wrap_implode ([ 'path' , 'to' , 'file.php' ], '/' );
// "/path/to/file.php"
$pattern = '#' . wrap_implode ([ 4 , 2 , 2 ], '\d' , '[-.]' ) . '#' ;
echo $pattern , "\n" ; // #\d[-.]\d[-.]\d#
echo preg_replace ( $pattern , '[REDACTED]' , 'The UFO appeared between 2012-12-24 and 2013.01.06 every night.' );
// 'The UFO appeared between [REDACTED] and [REDACTED] every night.
echo wrap_implode ([ 'line' , 'by' , 'line' ], '' , '' , '
' );
// line
by
line
10 years ago
It may be worth noting that if you accidentally call implode on a string rather than an array, you do NOT get your string back, you get NULL:
var_dump ( implode ( ':' , 'xxxxx' ));
?>
returns
NULL
This threw me for a little while.
11 years ago
Even handier if you use the following:
$id_nums = array( 1 , 6 , 12 , 18 , 24 );
$id_nums = implode ( ", " , $id_nums );
$sqlquery = "Select name,email,phone from usertable where user_id IN ( $id_nums )" ;
// $sqlquery becomes "Select name,email,phone from usertable where user_id IN (1,6,12,18,24)"
?>
Be sure to escape/sanitize/use prepared statements if you get the ids from users.
8 years ago
null values are imploded too. You can use array_filter() to sort out null values.
$ar = array( "hello" , null , "world" );
print( implode ( ',' , $ar )); // hello,,world
print( implode ( ',' , array_filter ( $ar , function( $v )< return $v !== null ; >))); // hello,world
?>
3 years ago
If you want to use a key inside array:
Example:
$arr=array(
array("id" => 1,"name" => "Test1"),
array("id" => 2,"name" => "Test2"),
);
echo implode_key(",",$arr, "name");
OUTPUT: Test1, Test2
function implode_key($glue, $arr, $key) $arr2=array();
foreach($arr as $f) if(!isset($f[$key])) continue;
$arr2[]=$f[$key];
>
return implode($glue, $arr2);
>
6 years ago
It is possible for an array to have numeric values, as well as string values. Implode will convert all numeric array elements to strings.
$test = implode ([ "one" , 2 , 3 , "four" , 5.67 ]);
echo $test ;
//outputs: "one23four5.67"
?>
2 years ago
There is no mention of behavior on a empty array, so I tried it and here's the result:
$ar = array();
$result = implode ( ',' , $ar ); // Comma arbitrarily applied as the separator
$is_result_empty = empty( $result );
?>
$result:
$is_result_empty: 1
In other words, an empty string is the result.
3 years ago
* Join pieces with a string recursively .
*
* @ param mixed $glue String between pairs ( glue ) or an array pair 's glue and key/value glue or $pieces.
* @param iterable $pieces Pieces to implode (optional).
* @return string Joined string
*/
function double_implode($glue, iterable $pieces = null): string
$glue2 = null;
if ($pieces === null) $pieces = $glue;
$glue = '';
> elseif (is_array($glue)) list($glue, $glue2) = $glue;
>
?php
$result = [];
foreach ($pieces as $key => $value) $result[] = $glue2 === null ? $value : $key . $glue2 . $value;
>
return implode($glue, $result);
>
?>
Examples:
$array = [' a ' => 1, 'b' => 2];
$str = implode($array);
$str = implode(' , ', $array);
$str = implode(['" ', ' keyword">, ', $iterator);
$str = implode(['" ', ' foot">+add a note
- Copyright © 2001-2024 The PHP Group
- My PHP.net
- Contact
- Other PHP.net sites
- Privacy policy