maneira mais rápida de implodir uma matriz associativa com chaves
-
03-07-2019 - |
Pergunta
Eu estou procurando uma maneira rápida de transformar uma matriz associativa em uma string. Estrutura típica seria como uma seqüência de consulta URL mas com separadores personalizáveis ??para que eu possa usar '&
' para links XHTML ou '&
' caso contrário.
A minha primeira inclinação é usar foreach
mas desde que meu método poderia ser chamado muitas vezes em uma solicitação temo que poderia ser muito lento.
<?php
$Amp = $IsXhtml ? '&' : '&';
$Parameters = array('Action' => 'ShowList', 'Page' => '2');
$QueryString = '';
foreach ($Parameters as $Key => $Value)
$QueryString .= $Amp . $Key . '=' . $Value;
Existe uma maneira mais rápida?
Solução
Você pode usar http_build_query()
para fazer isso.
Gera uma string codificada como URL a partir do associativa (ou indexada) gama fornecido.
Outras dicas
Como um aparte, eu estava em busca de encontrar a melhor maneira de implodir uma matriz associativa, mas usando minhas próprias seperators etc ...
Então eu fiz isso usando array_walk do PHP () para deixar-me juntar a uma matriz associativa em uma lista de parâmetros que poderia então ser aplicada a uma tag 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
Obviamente, você poderia furar isso em sua própria função de alguma forma, mas ela lhe dá uma idéia de como você pode participar de uma matriz associativa usando seu próprio método. Espero que ajude alguém:)
Se você não está preocupado com o exata ??em> formatação no entanto você quer algo simples, mas sem as quebras de linha de print_r
você também pode usar json_encode($value)
para uma saída formatada rápido e simples. ( nota que funciona bem em outros tipos de dados muito )
$str = json_encode($arr);
//output...
[{"id":"123","name":"Ice"},{"id":"234","name":"Cake"},{"id":"345","name":"Pie"}]
Esta é a minha solução por exemplo, para um div de dados-atributos:
<?
$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>
Uma maneira é utilizando print_r(array, true)
e ele irá retornar representação em cadeia de array
Um one-liner para a criação série de atributos HTML (com aspas) a partir de uma matriz simples:
$attrString = str_replace("+", " ", str_replace("&", "\" ", str_replace("=", "=\"", http_build_query($attrArray)))) . "\"";
Exemplo:
$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) ;
O que sobre este mais curto, mais transparente, ainda mais intuitiva com 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"
A minha solução:
$url_string = http_build_query($your_arr);
$res = urldecode($url_string);
Esta é a versão mais básica que eu posso pensar de:
public function implode_key($glue = "", $pieces = array())
{
$keys = array_keys($pieces);
return implode($glue, $keys);
}
echo implode(",", array_keys($companies->toArray()));
$companies->toArray()
-
este é apenas no caso, se o seu $variable
é um objeto, caso contrário, apenas passam $ empresas.
É isso aí!