Найшвидший спосіб застосувати асоціативний масив за допомогою клавіш


114

Я шукаю швидкий спосіб перетворити асоціативний масив у рядок. Типова структура виглядає як рядок запиту URL-адреси, але з налаштованими роздільниками, тому я можу використовувати " &" для xhtml посилань або " &" в іншому випадку.

Моя перша схильність - використовувати, foreachале оскільки мій метод можна було викликати багато разів за один запит, я боюся, що це може бути занадто повільним.

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

Чи є швидший шлях?


4
Не забувайте, якщо ви виводите HTML, правильний синтаксис - & amp; не &, якщо це неправильно <a href="?name=joe&age=22"> JOE </a> так, це працює, але це недійсний HTML.
TravisO

Відповіді:


174

Ви можете використовувати http_build_query()для цього.

Створює кодований URL-рядком рядок із наданого асоціативного (або індексованого) масиву.


Я намагався знайти цей метод в API PHP сам, це, безумовно, шлях. Якщо не альтернатива - використовувати модифікований метод імплодея, такий як uk2.php.net/manual/en/function.implode.php#84684, але http_build_query () буде належним чином швидше.
Марк Девідсон

Цікаво, чи справді це найшвидший спосіб для загального питання. У цій функції відбувається деяке кодування. Отже, якщо це не URL-адреса, чи справді це швидше, ніж array_walk, а що, якщо ви не хочете, щоб це було закодовано?
e-motiv

10
проблема полягає у http_build_queryвтечі спеціального чару
Сизіфа

1
Я порівняв serialize (), json_encode () та http_build_query (). http_build_query () виграв з невеликим відривом над serialize (), а json_encode - найповільнішим на сьогоднішній день.
ErnestV

5
Він також кодує спеціальних символів, тож це не гарний варіант
awavi

33

Як осторонь, я шукав найкращий спосіб застосувати асоціативний масив, але використовуючи власні сепаратори тощо.

Тому я зробив це за допомогою функції array_walk () PHP, щоб дозволити мені приєднати асоціативний масив до списку параметрів, які потім можна застосувати до тегу 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

Ця версія була корисною як перше рішення, оскільки 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"}]

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>

18

Одним із способів є використання, print_r(array, true)і він поверне рядкове представлення масиву


1
$ request_str = print_r ($ _ ЗАПИТАННЯ, правда); // вирівняти масив для файлу журналу
zzapper

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

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"


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"

-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об’єкт, інакше просто пропустіть $ компанії.

Це воно!


Це лише додає ключі до рядка; значення втрачаються.
FluffyKitten
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.