8

Пока вы все тут, продолжение темы: преобразовать массив в переменную.

Народ, а есть ли расширенный вариант функции implode для ассоциативных массивов?

Например:

$cars = array('van'=>'volvo xc70','coupe'=>'mercedes clk gtr','suv'=>'nissan pathfinder');

$glue1 = '<br />';
$glue2 = ' - ';
extended_implode($glue1,$glue2,$cars);

Вывод:

van - volvo xc70<br />
coupe - mercedes clk gtr<br />
suv - nissan pathfinder<br />

N.B.: Если штатной функции нет, лично мне алгоритм не нужен. =) Так что в этом случае вопрос меняется на "какие ошибки в моем способе".

function mb_extended_implode($glue1,$glue2,$elements,$enc='utf-8'){
  $out = '';
  foreach($elements as $key=>$value){
    $out .= $key.$glue2.$value.$glue1;
  }
  $out = mb_substr($out,0,mb_strlen($glue2,$enc),$enc);
  return $out;
}
knes
  • 25,879

4 Answers4

6
$res = array_map(function($k, $v) { return "$k - $v"; }, array_keys($cars), $cars);
echo implode('<br />', $res);

Или вот так, в зависимости от того, нужен <br /> на конце или нет:

$res = array_map(function($k, $v) { return "$k - $v<br />"; }, array_keys($cars), $cars);
echo implode('', $res);
Ilya Pirogov
  • 10,948
  • Хороший способ. Галочка. Примерно втрое быстрее моего. =) – knes Jun 13 '12 at 13:08
4

http_build_query

А вот это не подойдет ?

oneboy
  • 1,050
  • Вообще, очень близко. Настолько, что я даже поставлю плюсик и галочку. Скажем так: это способ нагляднее и проще, даже с учетом того, что, возможно, придется избавиться от URL-encode. – knes Jun 13 '12 at 11:40
  • только плюсик: все-таки с результатом очень много возни: режутся пробелы, ставятся знаки равенства... Но сама по себе функция очень полезная. – knes Jun 13 '12 at 13:09
2

Вот что можно найти на сайте php.net :

    Here is a function to implode and array including the key and value pair.

<?php /**

  • Implode an array with the key and value pair giving
  • a glue, a separator between pairs and the array
  • to implode.
  • @param string $glue The glue between key and value
  • @param string $separator Separator between pairs
  • @param array $array The array to implode
  • @return string The imploded array

*/ function array_implode( $glue, $separator, $array ) { if ( ! is_array( $array ) ) return $array; $string = array(); foreach ( $array as $key => $val ) { if ( is_array( $val ) ) $val = implode( ',', $val ); $string[] = "{$key}{$glue}{$val}";

}
return implode( $separator, $string );

} ?>

You can, for example, encode an array to be sent as an URL query using this: <?php $query = url_encode( array_implode( '=', '&', $array ) ); ?>

Or if you want to output an HTML element attributes: <?php echo '<input '.array_implode( '="', '" ', $array ).' />'; ?>

Hope it can help someone!

Чад
  • 9,073
  • 1
    Ну, я не вижу, если честно, существенных отличий от моего способа. – knes Jun 13 '12 at 11:41
  • Да их и нету наверное особых, просто это с сайта мануала пхп - это видимо и есть расширенный вариант функции аля "оффициальный" – Чад Jun 13 '12 at 11:46
0

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

$val = array_implode( $glue, $separator, $val );

Вот так выглядит вся функция. Тут мы будем иметь и ключи и значения.

function array_implode( $glue, $separator, $array ) {
    if ( ! is_array( $array ) ) return $array;
    $string = array();
    foreach ( $array as $key => $val ) {
        if ( is_array( $val ) )
            $val = array_implode( $glue, $separator, $val );
        $string[] = "{$key}{$glue}{$val}";

    }
    return implode( $separator, $string );

}