Подтвердить что ты не робот

Как объединить массив с ключом и значением без 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 в функцию будет гораздо более читабельным и модульным, чем писать однострочный (даже если все ответы велики!).

4b9b3361

Ответ 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'))