Генерация строки в цикле — PHP: Массивы
Генерация строк в циклах — задача, часто возникающая на практике. Типичный пример в вебе — функция-хелпер, помогающая генерировать HTML-списки в шаблонах. Она принимает на вход коллекцию элементов и возвращает список из них:
Такой способ вполне рабочий, но для большинства языков программирования максимально неэффективный. Дело в том, что конкатенация и интерполяция порождают новую строчку вместо старой и подобная ситуация повторяется на каждой итерации. Причём строка становится все больше и больше. Копирование строк приводит к серьёзному расходу памяти и может влиять на производительность. Конечно, для большинства приложений данная проблема неактуальна из-за малого объёма прогоняемых данных, но более эффективный подход не сложнее в реализации и обладает дополнительными плюсами. Поэтому стоит сразу приучить себя работать правильно и никогда больше не возвращаться к этому вопросу. В статических языках для подобной цели используется так называемый String Buffer. В динамических — обычный массив. Перепишем программу выше, используя новое знание:
$parts = []; // переименовал для того, чтобы не менять значения переменной foreach ($coll as $item) $parts[] = " $item> "; > $innerValue = implode('', $parts); $result = " $innerValue> ";
Как видите, код не сильно поменялся. Разница в том, что теперь собирается массив вместо строки, и в конце он собирается в строку с помощью implode . Помимо эффективности у такого подхода есть дополнительные плюсы:
- Такой код проще отлаживать и анализировать внутренности
- Массив можно дообработать, если надо, а строчку — уже нет
Регулируя разделитель, строки можно объединять разными способами. Например, через запятую:
$parts = ['JavaScript', 'PHP', 'Python']; $output = implode(',', $parts); print_r($output); // => JavaScript,PHP,Python
А пробел после запятой добавит пространство между словами, сделает вывод более аккуратным:
$parts = ['JavaScript', 'PHP', 'Python']; $output = implode(', ', $parts); // поменяли разделитель, добавив пробел print_r($output); // => JavaScript, PHP, Python
Если каждое слово надо вывести на новой строчке, то в качестве разделителя используем символ перевода строки «\n»
$parts = ['JavaScript', 'PHP', 'Python']; $output = implode("\n", $parts); // теперь каждое слово будет начинаться с новой строки // или с предопределённой константой // $output = implode(PHP_EOL, $parts); print_r($output); // => // JavaScript
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
implode
Alternative signature (not supported with named arguments):
Legacy signature (deprecated as of PHP 7.4.0, removed as of PHP 8.0.0):
Join array elements with a separator string.
Parameters
Optional. Defaults to an empty string.
The array of strings to implode.
Return Values
Returns a string containing a string representation of all the array elements in the same order, with the separator string between each element.
Changelog
Version | Description |
---|---|
8.0.0 | Passing the separator after the array is no longer supported. |
7.4.0 | Passing the separator after the array (i.e. using the legacy signature) has been deprecated. |
Examples
Example #1 implode() example
$array = [ ‘lastname’ , ’email’ , ‘phone’ ];
var_dump ( implode ( «,» , $array )); // string(20) «lastname,email,phone»
// Empty string when using an empty array:
var_dump ( implode ( ‘hello’ , [])); // string(0) «»
// The separator is optional:
var_dump ( implode ([ ‘a’ , ‘b’ , ‘c’ ])); // string(3) «abc»
Notes
Note: This function is binary-safe.
See Also
- explode() — Split a string by a string
- preg_split() — Split string by a regular expression
- http_build_query() — Generate URL-encoded query string
User Contributed Notes 14 notes
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: »
It’s not obvious from the samples, if/how associative arrays are handled. The «implode» function acts on the array «values», disregarding any keys:
$a = array( ‘one’ , ‘two’ , ‘three’ );
$b = array( ‘1st’ => ‘four’ , ‘five’ , ‘3rd’ => ‘six’ );
echo implode ( ‘,’ , $a ), ‘/’ , implode ( ‘,’ , $b );
?>
outputs:
one,two,three/four,five,six
Can also be used for building tags or complex lists, like the following:
?>
This is just an example, you can create a lot more just finding the right glue! 😉
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:
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.
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
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
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.
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.
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
?>
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);
>
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»
?>
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.
* 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
PHP. implode по одному полю многомерного массива
Данный материал предоставлен сайтом PacificSky.Ru исключительно в ознакомительных целях. Администрация не несет ответственности за его содержимое.
Выводим результат одного из полей многомерного массива в строку через запятую.
Представим, что нам понадобилось запросить данные из базы данных и результат одной из колонок вывести через запятую.
В своем примере в роли данных из БД, выступает массив $array. Который содержит: id, login и password.
Необходимо получить все логины (login) и вывести их в строку через запятую.
Конечно можно было воспользоваться foreach и результат элемента с ключом login записывать через запятую в переменную, но я считаю, что есть более быстрый и изящный вариант. Для этого воспользуемся php функциями: array_map и implode:
$array = [ [ 'id' => 1, 'login' => 'Alex', 'password' => '*******' ], [ 'id' => 2, 'login' => 'Fixlix', 'password' => '*******' ], [ 'id' => 3, 'login' => 'Pacific', 'password' => '*******' ], [ 'id' => 4, 'login' => 'Sky', 'password' => '*******' ] ]; echo implode(', ', array_map(function ($value) { return $value['login']; >, $array));
Callback функция array_map перебирает массив $array и возвращает данные только из поля login:
array_map(function ($value) { return $value['login']; >, $array)
Функция implode берет значения массива и возвращает эти значения в виде строки, через запятую (Запятая указана первым параметром в функции implode, но вы можете указывать тот символ, который требуется вам).
Вывод содержимого массива через запятую
Вывод заголовков полей массива / Вывод содержимого массива на веб-страницу не через print_r
Есть некий массив массивов, который передаётся в какой-то документ и там переприсваивается через .
Вывод массива в переменную через запятую с сохранением Регистра.
# Есть массив. $array1=array(‘Gfjh Jjytuj’,’Tht ghrh’,’Hfgj Dhgfgh Fhjc’); # Как всё его.
Вывод на экран через запятую
Добрый день, стоит задача, которую не получается решить. Существует регистрационная форма на сайте.
Перебор значений массива через запятую
По логике вещей я так понимаю, чтобы перебрать значения массива через запятую. echo explode(‘, ‘.
Сообщение от MaxSaf
$array1 = array($featured1_dir . $scan[$i]);
и представляет собой «img/portraits1.jpgimg/portraits2.jpgimg/portraits_3.jpg» с индексом 0
таким образом, думаю, надо сделать
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
$featured1_dir = 'img/'; $scan = scandir($featured1_dir); $array1 = array(); for ($i = 0; $i count($scan); $i++) { if ($scan[$i] != '.' && $scan[$i] != '..') { if (strpos($scan[$i], '.jpg') !== false) { $array1[] = $scan[$i]; } } } $files = implode(",", $array1); echo $files;
Вывод массива выборки через запятую
Товарищи, нужна помощь) $names="SELECT name FROM data WHERE age = 32";.
Как правильно составить вывод из бд через запятую и оператор if
Собственно такой код, подключение работает, можете сами подключится и как то это сделать, у меня.
Вывод данных при нескольких значений через запятую
Есть такие таблицы: CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, .
Запись данных в БД в несколько строк, взятых с массива через запятую
Здравствуйте, требуется небольшая помощь) есть код обработчика кнопки "Добавить", в нем я создаю.
Вывод содержимого бд со связями через php
Здравствуйте) Я сумел написать единственный код для вывода содержимого таблиц со связями: .
Вывод чисел через запятую
Что надо написать , что бы числа выводились через запятую