[php] PHP에서 foreach없이 키와 값으로 배열을 내파하는 방법

foreach없이 어떻게 이렇게 배열을 돌릴 수 있습니까?

array("item1"=>"object1", "item2"=>"object2",......."item-n"=>"object-n");

이와 같은 문자열에

item1='object1', item2='object2',.... item-n='object-n'

나는 implode()이미 생각 했지만 그것으로 열쇠를 내파하지 않습니다.

foreach가 필요한 경우 foreach를 중첩하지 않을 수 있습니까?

편집 : 문자열을 변경했습니다.


EDIT2 / UPDATE :
이 질문은 꽤 오래 전에 요청되었습니다. 그 당시 저는 모든 것을 한 줄로 작성하고 싶었 기 때문에 삼항 연산자를 사용하고 foreach를 위해 내장 함수 호출을 중첩했습니다. 그것은 좋은 습관이 아니 었습니다! 간결한 지 여부에 관계없이 읽을 수있는 코드를 작성하십시오.

이 경우 : foreach를 함수에 넣는 것은 한 줄로 작성하는 것보다 훨씬 더 읽기 쉽고 모듈화됩니다 (모든 답변이 훌륭하더라도!).



답변

그리고 다른 방법 :

$input = array(
    'item1'  => 'object1',
    'item2'  => 'object2',
    'item-n' => 'object-n'
);

$output = implode(', ', array_map(
    function ($v, $k) {
        if(is_array($v)){
            return $k.'[]='.implode('&'.$k.'[]=', $v);
        }else{
            return $k.'='.$v;
        }
    }, 
    $input, 
    array_keys($input)
));

또는:

$output = implode(', ', array_map(
    function ($v, $k) { return sprintf("%s='%s'", $k, $v); },
    $input,
    array_keys($input)
));


답변

다음 과 같이 http_build_query를 사용할 수 있습니다 .

<?php
  $a=array("item1"=>"object1", "item2"=>"object2");
  echo http_build_query($a,'',', ');
?>

산출:

item1=object1, item2=object2 

데모


답변

측정 (100000 회 반복)을 썼는데 연관 배열을 붙이는 가장 빠른 방법은 무엇입니까?

목표 : “key : value, key2 : value2″형식으로 1,000 개 항목의 행을 얻으려면

배열이 있습니다 (예 🙂 :

$array = [
    'test0' => 344,
    'test1' => 235,
    'test2' => 876,
    ...
];

테스트 번호 1 :

사용 http_build_query않는 str_replace를 :

str_replace('=', ':', http_build_query($array, null, ','));

1000 개 요소를 내파하는 데 걸리는 평균 시간 : 0.00012930955084904

두 번째 테스트 :

사용 array_map내파 :

implode(',', array_map(
        function ($v, $k) {
            return $k.':'.$v;
        },
        $array,
        array_keys($array)
    ));

1000 개 요소를 내파하는 데 걸리는 평균 시간 : 0.0004890081976675

세 번째 테스트 :

사용 array_walk내파 :

array_walk($array,
        function (&$v, $k) {
            $v = $k.':'.$v;
        }
    );
implode(',', $array);

1000 개 요소를 내파하는 데 걸리는 평균 시간 : 0.0003874126245348

네 번째 테스트 :

foreach 사용 :

    $str = '';
    foreach($array as $key=>$item) {
        $str .= $key.':'.$item.',';
    }
    rtrim($str, ',');

1000 개 요소를 내파하는 데 걸리는 평균 시간 : 0.00026632803902445

배열을 붙이는 가장 좋은 방법은 http_build_query 및 str_replace를 사용하는 것입니다.


답변

나는 serialize()또는 json_encode().

원하는 정확한 결과 문자열을 제공하지는 않지만 나중에 인코딩 / 저장 / 검색 / 디코딩하는 것이 훨씬 쉽습니다.


답변

array_walk 사용

$a = array("item1"=>"object1", "item2"=>"object2","item-n"=>"object-n");
$r=array();
array_walk($a, create_function('$b, $c', 'global $r; $r[]="$c=$b";'));
echo implode(', ', $r);

아이디어


답변

변화

-    return substr($result, (-1 * strlen($glue)));
+    return substr($result, 0, -1 * strlen($glue));

마지막 $ glue없이 전체 문자열을 resive하려면

function key_implode(&$array, $glue) {
    $result = "";
    foreach ($array as $key => $value) {
        $result .= $key . "=" . $value . $glue;
    }
    return substr($result, (-1 * strlen($glue)));
}

그리고 사용법 :

$str = key_implode($yourArray, ",");


답변

디버깅 목적으로. 반복적으로 중첩 된 배열의 배열을 문자열에 씁니다. foreach에 사용됩니다. 함수는 자국어 문자를 저장합니다.

function q($input)
{
    $glue = ', ';
    $function = function ($v, $k) use (&$function, $glue) {
        if (is_array($v)) {
            $arr = [];
            foreach ($v as $key => $value) {
                $arr[] = $function($value, $key);
            }
            $result = "{" . implode($glue, $arr) . "}";
        } else {
            $result = sprintf("%s=\"%s\"", $k, var_export($v, true));
        }
        return $result;
    };
    return implode($glue, array_map($function, $input, array_keys($input))) . "\n";
}