Перейти к содержимому

Как перевести массив в строку

  • автор:

Всё только о JavaScript

Для объединения всех элементов массива в одну строку используется метод массива join , принимающий единственным аргументом строку, которой необходимо разделить элементы.

var a = [1, 2, 3, 4]; alert(a.join('-')); // 1-2-3-4 

Метод join объединяет элементы для каждого индекса от 0 до length — 1 , при этом значения undefined и null преобразуются в пустую строку, остальные элементы приводятся к строке.

var a = [1, , null, undefined, 2]; alert(a.join('-')); // 1----2 

В спецификации языка указано

If no separator is provided, a single comma is used as the separator.

Т.е. если сепаратор не был передан, то в качестве него нужно использовать запятую. Данное предложение, однако, можно трактовать двояко: сепаратор не передан вообще или в качестве сепаратора передан undefined . Впрочем чуть ниже в спецификации указана чёткая инструкция.

If separator is undefined, let separator be the single-character string «,».

Т.е. если сепаратор равен undefined , то используется запятая. Именно такое поведение реализуют все браузеры, кроме Internet Explorer. IE подставляет запятую, только если join был вызван без аргументов.

var a = [1, 2, 3, 4]; alert(a.join()); // 1,2,3,4 во всех браузерах alert(a.join(undefined)); // 1undefined2undefined3undefined4 в IE, 1,2,3,4 в остальных браузерах 

Метод join можно использовать также для элегантной реализации повторения строки, т.е. из строки ‘ab’ , например, получить строку ‘abababab’ . Действительно, пустые элементы массива преобразуются в пустые строки, но при этом разделяются сепаратором. Следовательно, чтобы повторить строку n раз, нужно взять пустой массив, у которого length равен n + 1 , и вызвать у него метод join с аргументом, равным размножаемой строке.

/** * Повторяет исходную строку n раз. * @param n Число повторений строки * @return Размноженная строка. */ String.prototype.times = function(n) < return new Array(n + 1).join(this); >; alert('01'.times(4)); // 01010101 

Массивы, как и любой другой объект в JavaScript, имеют встроенный метод toString , вызываемый при неявном преобразовании в строку. Этот метод у них аналогичен вызову метода join без аргументов, т.е. элементы разделяются запятой.

var str = 'ab', a = [1, 2, 3, 4]; alert(str + a); // ab1,2,3,4 

Для отладочных целей можно во время разработки переопределять toString так, чтобы добавлялись квадратные скобки в начале и в конце массива, тогда будет легче просматривать вложенные массивы.

var a = [1, 2, ['a', 'b', 'c'], 3, 4]; alert(a); // 1,2,a,b,c,3,4 Array.prototype.toString = function() < return '[' + this.join(', ') + ']'; >; alert(a); // [1, 2, [a, b, c], 3, 4] 

Создание массива из строки

Для обратного преобразования строки в массив у строк есть метод split , аналогично join принимающий разделитель, по которому требуется разбить строку.

var str = '1-2-3-4'; alert(str.split('-')); // 1,2,3,4 

Обратите внимание, что если вызвать split у пустой строки, то мы получим не пустой массив, а массив с одним элементом, равным пустой строке.

var a = ''.split(','); alert([a.length, a[0] == '']); // 1,true 

Как перевести массив в строку

Доброго времени суток! Задался вопросом, есть ли какая то стандартная функция, которая преобразует массив строк в 1 строку, типа:

строка 1;
строка 2;
строка 3;

строка1, строка2, строка3.

Хотелось бы узнать есть ли какая нить стандартная функция, или нет?!

Для каждого Значение Из Массив Цикл
Строка = Строка + Значение;
КонецЦикла;

если массив только из строк, то

(2)+ а, попутал, это пилит строку
(3)+ но в обратную сторону клеит достаточно быстро, ну а вообще — извратится можно

(0)
есть вопрос на засыпку.
а для чего ?

кода на 5 строчек

Функция Склейка(Строка1, Строка2, Строка3=»», Строка4=»», и т.д.)
Возврат Строка1+Строка2+Строка3+Строка4+ и т.д. аналогично;

(6) на входе массив

Оооо. Скока тут извращенцев)))
вопрос заключается в быстродействии))) Я циклы не люблю просто) А если использовать стандартную конструкцию, то получается цикл в цикле)) Ну ладно, думаю цикл на массиву строк сильной нагрузки не даст. Потому как размерность массива может быть большая.

(7) точно, так чем
«конструкция

Для каждого Значение Из Массив Цикл
Строка = Строка + Значение;
КонецЦикла;

а ещё склейку можно делать в том месте, где всё пишется в массив, наверное

У меня идет обработка результата запроса. Может обрабатываться порядка 100 — 200 элементов. Все это дело выводится в ТД. У каждого элемента есть ТЧ (даже целых три), в этих ТЧ хранится грубо говоря набор строк (пусть будет «1», «2», «3». не буду в даваться в подробности что они значат) В Каждой ТЧ тоже по 6-50 элементов. Надо чтобы список из ТЧ выводился в строку (например, «1, 2, 3, 4, . n») и строка выводилась в ТД. Содержимое ТЧ я загнал в массив. Т.к. думаю, что массив быстрее всего обрабатывается. Но цикл все равно придется применить.

ну и собственно переживал по поводу производительности 🙂

Сорри за код, надо так:
Массив = ВыборкаДетальныеЗаписи.Ссылка.ТЧ.ВыгрузитьКолонку(«Номер»);

ТМП = ЗначениеВСтрокуВнутр(Массив);
ТМП = СтрЗаменить(ТМП,»»»>,»+Символы.ПС+»ТМП = Сред(ТМП,54,СтрДлина(ТМП)-59);
ТМП = СтрЗаменить(ТМП,»»»»»»,»»»»);
Возврат ТМП;

Возможны баги 🙂
заодно проверьте, как оно себя ведет на больших массивах по сравнению с циклом по производительности

о, нашел багу

ТМП = ЗначениеВСтрокуВнутр(Массив);
ТМП = СтрЗаменить(ТМП,»»»>,»+Символы.ПС+»ДопДлина=СтрДлина(Формат(Массив.Количество(),»ЧГ «»»»»,»»»»);
Возврат ТМП;

ГСЧ = Новый ГенераторСлучайныхЧисел;

мЯваСкрипт = Новый COMОбъект(«MSScriptControl.ScriptControl»);
мЯваСкрипт.Language = «javascript»;

Массив = Новый Массив;
Для Сч = 1 по 50000 Цикл
Массив.Добавить(Строка(ГСЧ.СлучайноеЧисло(0,100)));
КонецЦикла;

Т = мЯваСкрипт.Eval(«(new Date()).valueOf()»);
ТМП1 = ЗначениеВСтрокуВнутр(Массив);
ТМП1 = СтрЗаменить(ТМП1,»»»>,»+Символы.ПС+»ДопДлина = СтрДлина(Формат(Массив.Количество(),»ЧГ «»»»»,»»»»);
Вр1 = (мЯваСкрипт.Eval(«(new Date()).valueOf()»)-Т);
Сообщить(«Способ 1 «+ Вр1+»мс»);

Т = мЯваСкрипт.Eval(«(new Date()).valueOf()»);
ТМП2 = «»;
Для Сч = 0 По Массив.Количество()-1 Цикл
ТМП2 = ТМП2 + ?(Сч = 0,»»,Разделитель) + Массив[Сч];
КонецЦикла;
Вр2 = (мЯваСкрипт.Eval(«(new Date()).valueOf()»)-Т);
Сообщить(«Способ 2 «+ Вр2+»мс»);
Сообщить(«В «+ Цел(Вр2/Вр1) +» раз быстрее»);

Итог:
Способ 1 79мс
Способ 2 2 843мс
В 35 раз быстрее
истина

Кстати, если элеметнов в массиве больше 50000 и длина элемента > 4, то способ два — не работает почему-то

а, не, работает, но очень медленно
(12) ну можно ведь нормально переписать запрос, чем так зверски над собой изващаться.
Долго думал? Но потом сделали в регистре сведений связки строк.
что мешает переписать запрос?
можно в скрипт на васике передать массив строк и сделать Join
но писать код лень 🙂
(22) но это же внутри офигенного цикла будет. То есть васик будет вызываться 100000 раз.
(23)
Зачем 100000 раз — один раз передал весь массив и усе.

Вот так примерно:

Скрипт = Новый COMОбъект(«MSScriptControl.ScriptControl»);
Скрипт.Language=»JScript»;
Скрипт.AddCode(«function join(ar, delim)»);
с = Скрипт.CodeObject.join(Новый COMSafeArray(массивСтрок, «VT_VARIANT»), «,»);

(26) преобразование в ком массив тупит:

ГСЧ = Новый ГенераторСлучайныхЧисел;

мЯваСкрипт = Новый COMОбъект(«MSScriptControl.ScriptControl»);
мЯваСкрипт.Language = «javascript»;

Массив = Новый Массив;
Для Сч = 1 по 10000 Цикл
Массив.Добавить(Строка(ГСЧ.СлучайноеЧисло(100000000,999999999)));
КонецЦикла;

Т = мЯваСкрипт.Eval(«(new Date()).valueOf()»);
ТМП1 = ЗначениеВСтрокуВнутр(Массив);
ТМП1 = СтрЗаменить(ТМП1,»»»>,»+Символы.ПС+»ДопДлина = СтрДлина(Формат(Массив.Количество(),»ЧГ «»»»»,»»»»);
Вр1 = (мЯваСкрипт.Eval(«(new Date()).valueOf()»)-Т);
Сообщить(«Способ 1 «+ Вр1+»мс»);

Т = мЯваСкрипт.Eval(«(new Date()).valueOf()»);
ТМП2 = «»;
Для Сч = 0 По Массив.Количество()-1 Цикл
ТМП2 = ТМП2 + ?(Сч = 0,»»,Разделитель) + Массив[Сч];
КонецЦикла;
Вр2 = (мЯваСкрипт.Eval(«(new Date()).valueOf()»)-Т);
Сообщить(«Способ 2 «+ Вр2+»мс»);

Скрипт = Новый COMОбъект(«MSScriptControl.ScriptControl»);
Скрипт.Language=»JScript»;
Скрипт.AddCode(«function join(ar, delim)»);

Т = мЯваСкрипт.Eval(«(new Date()).valueOf()»);
ТМП3 = Скрипт.CodeObject.join(Новый COMSafeArray(массив, «VT_VARIANT»), Разделитель);
Вр3 = (мЯваСкрипт.Eval(«(new Date()).valueOf()»)-Т);
Сообщить(«Способ 3 «+ Вр3+»мс»);

Сообщить(ТМП1 = ТМП2);
Сообщить(ТМП2 = ТМП3);

Выводит
Способ 1 16мс
Способ 2 500мс
Способ 3 63мс
истина
истина

Преобразование массива в строку в JavaScript

Для обработки данных и выполнения с ними манипуляций может возникнуть потребность преобразования массива в строку. Например, когда необходимо отправить данные в строчном типе, из массива делается строка и только тогда отправляется. Либо нам просто нужно объединить все элементы массива единой строкой.

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

toString()

Метод toString() помогает преобразовывать различные типы данных в строку. Он выводит строку, содержащую все элементы массива, разделенные запятыми.

['a', 'b', 'c'].toString(); // 'a,b,c' ['text', 123, true].toString() // 'text,123,true'

String()

Функция осуществляет явное преобразование в строку.

String(['a', 'b', 'c']); // 'a,b,c' String(['text', 123, true]) // 'text,123,true'

concat()

В JavaScript метод concat() в основном используется для объединения нескольких строк. Однако его также можно использовать для преобразования указанного массива в строку. Для этого нужно соединить элементы массива с пустой строкой.

''.concat(['a', 'b', 'c']); // 'a,b,c'

Явное приведение

Подобно методу concat() массив можно преобразовать в строку путем обычного прибавления к нему пустой строки или пустого массива.

['a', 'b', 'c'] + []; // 'a,b,c' ['text', 123, true] + ''; // 'text,123,true'

join()

Метод join() предлагает функциональность преобразования массива в строку. Элементы массива становятся строкой, однако теперь способ их объединения можно указать в качестве аргумента метода.

['a', 'b', 'c'].join(); // 'a,b,c' (по-умолчанию разделитель ',') ['и', 'в', 'а', 'н'].join(''); // 'иван' ['text', 123, true].join('-'); // 'text-123-true'

JSON.stringify()

Метод преобразует массив в строку формата JSON, соблюдая определенные правила синтаксиса, чтобы потом ее можно было обратно преобразовать в исходное состояние или распарсить.

JSON.stringify(['a', 'b', 'c']); // '["a","b","c"]' JSON.stringify([145, false, ]); // '[145,false,]'

forEach()

Если массив необходимо сохранить, но при этом получить строку из него, используем перебирающий метод forEach() . На этапе каждой итерации обновляем созданную строку.

let array = ['a', 'b', 'c']; let string = ''; array.forEach(function(item, index) < string += item; if (index != (array.length - 1)) < string += ','; >; >); console.log(string); // => 'a,b,c'

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;
>

$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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

https://kodirovanie.vyvod-iz-zapoya-na-domu-moskva-snp.ru/