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 ? '&amp;' : '&';
$Parameters = array('Action' => 'ShowList', 'Page' => '2');
$QueryString = '';
foreach ($Parameters as $Key => $Value)
        $QueryString .= $Amp . $Key . '=' . $Value;

Existe uma maneira mais rápida?

Foi útil?

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 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í!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top