Как объединить массив с ключом и значением без foreach в PHP
Без foreach
как я могу превратить массив вроде этого
array("item1"=>"object1", "item2"=>"object2",......."item-n"=>"object-n");
для строки, подобной этой
item1='object1', item2='object2',.... item-n='object-n'
Я уже думал о implode()
, но он не развязывает ключ с ним.
Если это необходимо, возможно ли не вложить foreach?
EDIT: Я изменил строку
EDIT2/UPDATE:
Этот вопрос был задан довольно давно. В то время я хотел написать все в одной строке, поэтому я бы использовал тройные операторы и гнездо, встроенные в вызовы функций в пользу foreach. Это была не лучшая практика! Писать код, который можно прочитать, будь то кратким или нет, не имеет большого значения.
В этом случае: помещать foreach в функцию будет гораздо более читабельным и модульным, чем писать однострочный (даже если все ответы велики!).
Ответы
Ответ 1
и другим способом:
$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)
));
Ответ 2
Вы можете использовать http_build_query, например:
<?php
$a=array("item1"=>"object1", "item2"=>"object2");
echo http_build_query($a,'',', ');
?>
Вывод:
item1=object1, item2=object2
Демо-версия
Ответ 3
Я провел измерения (100000 итераций), какой самый быстрый способ склеить ассоциативный массив?
Цель: Чтобы получить строку из 1000 элементов в этом формате: "key: value, key2: value2"
У нас есть массив (например):
$array = [
'test0' => 344,
'test1' => 235,
'test2' => 876,
...
];
Тест номер один:
Используйте http_build_query и str_replace:
str_replace('=', ':', http_build_query($array, null, ','));
Среднее время для развязывания 1000 элементов: 0.00012930955084904
Тест номер два:
Используйте array_map и implode:
implode(',', array_map(
function ($v, $k) {
return $k.':'.$v;
},
$array,
array_keys($array)
));
Среднее время для развязывания 1000 элементов: 0.0004890081976675
Тестовый номер три:
Используйте array_walk и implode:
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
Ответ 4
Я бы использовал serialize()
или json_encode()
.
Пока он не даст вам точную строку результата, которую вы хотите, было бы намного легче кодировать/хранить/извлекать/декодировать позже.
Ответ 5
Использование 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);
IDEONE
Ответ 6
Измените
- return substr($result, (-1 * strlen($glue)));
+ return substr($result, 0, -1 * strlen($glue));
если вы хотите обновить всю строку без последнего $glue
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, ",");
Ответ 7
В целях отладки. Рекурсивная запись массива вложенных массивов в строку.
Используется 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";
}
Ответ 8
Вы можете использовать PHP array_reduce,
$a = ['Name' => 'Last Name'];
function acc($acc,$k)use($a){ return $acc .= $k.":".$a[$k].",";}
$imploded = array_reduce(array_keys($a), "acc");
Ответ 9
Для создания mysql, где условия из массива
$sWheres = array('item1' => 'object1',
'item2' => 'object2',
'item3' => 1,
'item4' => array(4,5),
'item5' => array('object3','object4'));
$sWhere = '';
if(!empty($sWheres)){
$sWhereConditions = array();
foreach ($sWheres as $key => $value){
if(!empty($value)){
if(is_array($value)){
$value = array_filter($value); // For remove blank values from array
if(!empty($value)){
array_walk($value, function(&$item){ $item = sprintf("'%s'", $item); }); // For make value string type 'string'
$sWhereConditions[] = sprintf("%s in (%s)", $key, implode(', ', $value));
}
}else{
$sWhereConditions[] = sprintf("%s='%s'", $key, $value);
}
}
}
if(!empty($sWhereConditions)){
$sWhere .= "(".implode(' AND ', $sWhereConditions).")";
}
}
echo $sWhere; // (item1='object1' AND item2='object2' AND item3='1' AND item4 in ('4', '5') AND item5 in ('object3', 'object4'))