Без foreach , как я могу превратить массив, подобный этому
array("item1"=>"object1", "item2"=>"object2",......."item-n"=>"object-n");
к строке, подобной этой
item1='object1', item2='object2',.... item-n='object-n'
Я уже думал о implode()
, но он не развязывает ключ с ним.
Если foreach это необходимо, возможно ли не вложить foreach?
EDIT: я изменил строку
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 итераций), какой самый быстрый способ склеить ассоциативный массив?
Цель: получить строку из 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
Я бы использовал 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);
IDEONE
+ Изменить
- return substr($result, (-1 * strlen($glue))); + return substr($result, 0, -1 * strlen($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, ",");
Для целей отладки. Рекурсивная запись массива вложенных массивов в строку. Используется 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"; }
Вы также можете использовать массив array_reduce PHP,
$a = ['Name' => 'Last Name']; function acc($acc,$k)use($a){ return $acc .= $k.":".$a[$k].",";} $imploded = array_reduce(array_keys($a), "acc");
Для создания 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'))