Самый быстрый способ разложить ассоциативный массив с помощью ключей
-
03-07-2019 - |
Вопрос
Я ищу быстрый способ превратить ассоциативный массив в строку.Типичная структура будет похожа на строку запроса URL-адреса, но с настраиваемыми разделителями, поэтому я могу использовать '&
' для ссылок xhtml или '&
' в противном случае.
Моя первая склонность - использовать foreach
но поскольку мой метод может вызываться много раз в одном запросе, я боюсь, что он может быть слишком медленным.
<?php
$Amp = $IsXhtml ? '&' : '&';
$Parameters = array('Action' => 'ShowList', 'Page' => '2');
$QueryString = '';
foreach ($Parameters as $Key => $Value)
$QueryString .= $Amp . $Key . '=' . $Value;
Есть ли более быстрый способ?
Решение
Вы можете использовать http_build_query()
сделать это.
Генерирует строку запроса в кодировке URL-адреса из предоставленного ассоциативного (или индексированного) массива.
Другие советы
Кроме того, я искал лучший способ взорвать ассоциативный массив, но используя свои собственные разделители и т.д...
Поэтому я сделал это, используя функцию 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
Очевидно, вы могли бы каким-то образом внедрить это в свою собственную функцию, но это дает вам представление о том, как можно объединить ассоциативный массив, используя свой собственный метод.Надеюсь, это кому-то поможет :)
Если вас не беспокоит точный форматирование, однако вам нужно что-то простое, но без разрывов строк print_r
вы также можете использовать json_encode($value)
для быстрого и простого форматированного вывода.(обратите внимание, что он хорошо работает и с другими типами данных.)
$str = json_encode($arr);
//output...
[{"id":"123","name":"Ice"},{"id":"234","name":"Cake"},{"id":"345","name":"Pie"}]
Это мое решение, например, для атрибутов данных 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>
Один из способов — использование print_r(array, true)
и он вернет строковое представление массива
Однострочник для создания строки атрибутов 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"
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) ;
А как насчет более короткого, прозрачного и интуитивно понятного метода 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"
Мое решение:
$url_string = http_build_query($your_arr);
$res = urldecode($url_string);
Это самая базовая версия, которую я могу придумать:
public function implode_key($glue = "", $pieces = array())
{
$keys = array_keys($pieces);
return implode($glue, $keys);
}
echo implode(",", array_keys($companies->toArray()));
$companies->toArray()
- это на всякий случай, если ваш $variable
является объектом, в противном случае просто передайте $company.
Вот и все!