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";
}