키로 연관 배열을 내파하는 가장 빠른 방법


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; &, iow 이것은 잘못된 <a href="?name=joe&age=22"> JOE </a> 예, 작동하지만 잘못된 HTML입니다.
TravisO

답변:


174

http_build_query()그렇게하는 데 사용할 수 있습니다 .

제공된 연관 (또는 인덱싱 된) 배열에서 URL로 인코딩 된 쿼리 문자열을 생성합니다.


PHP API에서이 방법을 직접 찾으려고했는데 이것이 확실히 갈 길입니다. 대안이 아니라면 uk2.php.net/manual/en/function.implode.php#84684 와 같은 수정 된 implode 메서드를 사용하는 것이지만 http_build_query ()가 적절하게 더 빠릅니다.
Mark Davidson

이것이 일반적인 질문에 대한 가장 빠른 방법인지 궁금합니다. 이 함수에는 일부 인코딩이 진행되고 있습니다. 따라서 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

제쳐두고, 나는 연관 배열을 파열시키는 가장 좋은 방법을 찾고 있었지만 내 자신의 구분 기호 등을 사용했습니다.

그래서 저는 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

이 버전은 http_build_query ()가 URL을 인코딩하므로 첫 번째 솔루션으로 유용합니다.
Ernesto Allely 2014

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 ($ _ REQUEST, true); // 로그 파일에 대한 배열 평면화
zzapper 2013 년

2
그러나 이는 key=value제공된 구분 기호 로 결합 된 것이 아니라 print_r 형식으로 출력됩니다 .
Rikki 2014 년

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"

1

내 솔루션 :

$url_string = http_build_query($your_arr);
$res = urldecode($url_string); 

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, 선택한 구분자로 파열되지 않습니다 !
Rikki 2014 년

-3
echo implode(",", array_keys($companies->toArray()));

$companies->toArray()-이것은 당신 $variable이 객체 인 경우에만 해당되며 그렇지 않으면 $ companies를 전달하십시오.

그게 다야!


이것은 문자열에 키만 추가합니다. 값이 손실됩니다.
FluffyKitten 2010 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.