php implode

izbushka
На сайте с 08.06.2007
Offline
110
654

Есть массив PHP: $array=('x1','x2',..,'xN');

Можно ли собрать его в строку используя только встроенные функции по шаблону: "key=? or value=?"

Т.е. резальтат должен быть такой: "key=x1 or value=x1 key=x2 or value=x2 ... key=xN or value=xN"

Как решить пользовательской функцией ясно, интересно именно встреонными функциями в строчном контексте:

$sting="some_text".implode('key=? or value=? ',$array)." another text";

В качестве implode использовать функцию(и), позволяющие это сделать.

Вполне возможно, что это невозможно :) Задача чисто теоретическая.

C
На сайте с 04.02.2005
Offline
291
#1

implode(' ',array_walk($array, fun))

A
На сайте с 19.07.2010
Offline
130
#2

implode( array_map(....) ) - готово

что-то типа


function my_f($n) {
return "key=$n or value=$n";
}

$a = array(1, 2, 3, 4, 5);
echo implode(', ', array_map("my_f", $a) );

на выходе:


key=1 or value=1, key=2 or value=2, key=3 or value=3, key=4 or value=4, key=5 or value=5
.............
izbushka
На сайте с 08.06.2007
Offline
110
#3
Chukcha:
array_walk

Она не возвращает массив, но идея ясна.

admak:
array_map

Работает, но использует пользовательскую функцию в качестве колбека :)

можно, конечно, сделать ее анонимной:

implode(', ', array_map( function ($x) {return('tt ='.$x.' ff='.$x); },$a));

но все же можно ли ее избежать совсем?

A
На сайте с 19.07.2010
Offline
130
#4

не понятен глубинный смысл этих действий

ну можно перевернуть с ног на голову: сначала implode, а потом натягиваем шаблон:


$a = array(1, 2, 3, 4, 5);
echo preg_replace( '/{{(.*?)}}/', 'key=$1 or value=$1', "{{".implode('}}, {{', $a)."}}" );

результат:


key=1 or value=1, key=2 or value=2, key=3 or value=3, key=4 or value=4, key=5 or value=5
izbushka
На сайте с 08.06.2007
Offline
110
#5
admak:
не понятен глубинный смысл этих действий

Его нет.

admak:
сначала implode, а потом натягиваем шаблон

Да, такой вариант подходит

Более красивые идеи? :)

A
На сайте с 19.07.2010
Offline
130
#6
izbushka:
Более красивые идеи? :)

вспомнил, что preg_replace может работать с массивами:


$a = array(1, 2, 3, 4, 5);
echo implode(', ', preg_replace( '/^(.*)$/', 'key=$1 or value=$1', $a) );
C
На сайте с 04.02.2005
Offline
291
#7

Самая красивая - та, которая работает и решена быстро :)

Glueon
На сайте с 26.07.2013
Offline
172
#8

Да, действительно с preg_replace лучше ... Но я свой ужас все равно выложу :)


$arr = array('a', 'b', 'c');
$output = vsprintf(
str_repeat( 'key=%s or ', count($arr) ) . 'false' . str_repeat( ' or val=%s', count($arr) ),
array_merge($arr, $arr) );
var_dump($output);
Есть много IP-сетей в аренду под прокси, парсинг, рассылки (optin), vpn и хостинг. Телега: @contactroot ⚒ ContactRoot команда опытных сисадминов (/ru/forum/861038), свой LIR: сдаем в аренду сети IPv4/v6 (/ru/forum/1012475).
A
На сайте с 19.07.2010
Offline
130
#9
Chukcha:
Самая красивая - та, которая работает и решена быстро :)

стабильно работает и самое главное: когда глядя на свой код через полгода - год, не впадаешь в ступор, а сразу вспоминаешь что и как.

лучше выбрать стиль: однотипно и однообразно. :)

ps: я до сих пор не могу себя заставить использовать str_ функции, все на регулярках делаю.

pss: задачки еще будут? :) а то не работается...

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий