Самый быстрый способ взорвать ассоциативный массив с ключами

114

Я ищу быстрый способ превратить ассоциативный массив в строку. Типичная структура будет похожа на строку запроса URL, но с настраиваемыми разделителями, поэтому я могу использовать " &" для ссылок xhtml или " &" в противном случае.

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

<?php
$Amp = $IsXhtml ? '&amp;' : '&';
$Parameters = array('Action' => 'ShowList', 'Page' => '2');
$QueryString = '';
foreach ($Parameters as $Key => $Value)
        $QueryString .= $Amp . $Key . '=' . $Value;

Есть более быстрый способ?

matpie
источник
4
Не забывайте, что если вы выводите HTML, правильный синтаксис - & amp; не &, iow это неправильно <a href="?name=joe&age=22"> JOE </a> да, это работает, но это недопустимый HTML.
TravisO, 06

Ответы:

174

Вы можете использовать http_build_query()для этого.

Создает строку запроса в кодировке URL из предоставленного ассоциативного (или индексированного) массива.

Greg
источник
Я сам пытался найти этот метод в PHP API, это определенно путь. Если нет, альтернативой является использование модифицированного метода взрыва, такого как uk2.php.net/manual/en/function.implode.php#84684, но http_build_query () будет работать быстрее.
Марк Дэвидсон,
Интересно, действительно ли это самый быстрый способ ответить на общий вопрос. В этой функции происходит некоторая кодировка. Итак, если это не для URL-адреса, действительно ли это быстрее, чем array_walk, и что, если вы не хотите его кодировать?
e-motiv
10
проблема в том, чтобы http_build_queryизбежать специального символа
Sisyphus
1
Я сравнил serialize (), json_encode () и http_build_query (). http_build_query () с небольшим отрывом победил serialize (), а json_encode был самым медленным на данный момент.
ErnestV
5
Он также кодирует специальные символы, так что это не лучший вариант
awavi
33

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

Я сделал это, используя функцию PHP array_walk (), чтобы я мог присоединить ассоциативный массив к списку параметров, которые затем можно было бы применить к тегу HTML ....

// Create Params Array
$p = Array("id"=>"blar","class"=>"myclass","onclick"=>"myJavascriptFunc()");

// Join Params
array_walk($p, create_function('&$i,$k','$i=" $k=\"$i\"";'));
$p_string = implode($p,"");

// Now use $p_string for your html tag

Очевидно, вы могли бы каким-то образом закрепить это в своей собственной функции, но это дает вам представление о том, как вы можете присоединиться к ассоциативному массиву, используя свой собственный метод. Надеюсь, это кому-то поможет :)


источник
6
Если синтаксис create_function кого-то смущает, см. Php.net/manual/en/function.create-function.php
Мэтт Флетчер,
array_walk медленнее от foreach и более сложен для чтения. Смотрите это: reddit.com/r/PHP/comments/1uuc34/…
Enyby 01
Эта версия оказалась полезной в качестве первого решения, поскольку http_build_query () кодирует URL-адреса.
Эрнесто Аллели
32

Если вас не беспокоит точное форматирование, но вам нужно что-то простое, но без разрывов строк, print_rвы также можете использовать его json_encode($value)для быстрого и простого форматированного вывода. ( обратите внимание, что он хорошо работает и с другими типами данных )

$str = json_encode($arr);
//output...
[{"id":"123","name":"Ice"},{"id":"234","name":"Cake"},{"id":"345","name":"Pie"}]
scunliffe
источник
19

Это мое решение, например, для атрибутов данных div:

<?

$attributes = array(
    'data-href'   => 'http://example.com',
    'data-width'  => '300',
    'data-height' => '250',
    'data-type'   => 'cover',
);

$dataAttributes = array_map(function($value, $key) {
    return $key.'="'.$value.'"';
}, array_values($attributes), array_keys($attributes));

$dataAttributes = implode(' ', $dataAttributes);

?>

<div class="image-box" <?= $dataAttributes; ?> >
    <img src="http://example.com/images/best-of.jpg" alt="">
</div>
user4846194
источник
18

Один из способов - использовать, print_r(array, true)и он вернет строковое представление массива

dino.keco
источник
1
$ request_str = print_r ($ _ REQUEST, правда); // сгладить массив для файла журнала
zzapper 08
2
Но это выводится в формате print_r, а не в key=valueсочетании с поставляемым разделителем.
Рикки
1
function array_to_attributes ( $array_attributes )
{

    $attributes_str = NULL;
    foreach ( $array_attributes as $attribute => $value )
    {

        $attributes_str .= " $attribute=\"$value\" ";

    }

    return $attributes_str;
}

$attributes = array(
    'data-href'   => 'http://example.com',
    'data-width'  => '300',
    'data-height' => '250',
    'data-type'   => 'cover',
);

echo array_to_attributes($attributes) ;
Softmixt
источник
1

Однострочник для создания строки атрибутов HTML (с кавычками) из простого массива:

$attrString = str_replace("+", " ", str_replace("&", "\" ", str_replace("=", "=\"", http_build_query($attrArray)))) . "\"";

Пример:

$attrArray = array("id"    => "email", 
                   "name"  => "email",
                   "type"  => "email",
                   "class" => "active large");

echo str_replace("+", " ", str_replace("&", "\" ", str_replace("=", "=\"", http_build_query($attrArray)))) . "\"";

// Output:
// id="email" name="email" type="email" class="active large"
WackGet
источник
1

Мое решение:

$url_string = http_build_query($your_arr);
$res = urldecode($url_string); 
kostikovmu
источник
0

А как насчет этого более короткого, прозрачного и еще более интуитивного с помощью array_walk

$attributes = array(
  'data-href'   => 'http://example.com',
  'data-width'  => '300',
  'data-height' => '250',
  'data-type'   => 'cover',
);

$args = "";
array_walk(
    $attributes, 
    function ($item, $key) use (&$args) {
        $args .= $key ." = '" . $item . "' ";  
    }
);
// output: 'data-href="http://example.com" data-width="300" data-height="250" data-type="cover"
FantomX1
источник
-2

Это самая простая версия, о которой я могу думать:

public function implode_key($glue = "", $pieces = array())
{
    $keys = array_keys($pieces);
    return implode($glue, $keys);
}
Джастин
источник
12
Это только взрывает ключи, но не взрывается key=valueвыбранным разделителем!
Рикки
-3
echo implode(",", array_keys($companies->toArray()));

$companies->toArray()- это на всякий случай, если ваш $variableобъект, иначе просто пропустите $ companies.

Это оно!

Хардик Раваль
источник
Это только добавляет ключи к строке; ценности потеряны.
FluffyKitten