How to implode array with key and value without foreach in PHP

PhpArraysStringImplode

Php Problem Overview


Without foreach, how can I turn an array like this

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

to a string like this

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

I thought about implode() already, but it doesn't implode the key with it.

If foreach it necessary, is it possible to not nest the foreach?

EDIT: I've changed the string


EDIT2/UPDATE: This question was asked quite a while ago. At that time, I wanted to write everything in one line so I would use ternary operators and nest built in function calls in favor of foreach. That was not a good practice! Write code that is readable, whether it is concise or not doesn't matter that much.

In this case: putting the foreach in a function will be much more readable and modular than writing a one-liner(Even though all the answers are great!).

Php Solutions


Solution 1 - Php

You could use http_build_query, like this:

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

Output:

item1=object1, item2=object2 

Demo

Solution 2 - Php

and another way:

$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)
));

or:

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

Solution 3 - Php

I spent measurements (100000 iterations), what fastest way to glue an associative array?

Objective: To obtain a line of 1,000 items, in this format: "key:value,key2:value2"

We have array (for example):

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

Test number one:

Use http_build_query and str_replace:

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

Average time to implode 1000 elements: 0.00012930955084904

Test number two:

Use array_map and implode:

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

Average time to implode 1000 elements: 0.0004890081976675

Test number three:

Use array_walk and implode:

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

Average time to implode 1000 elements: 0.0003874126245348

Test number four:

Use foreach:

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

Average time to implode 1000 elements: 0.00026632803902445

I can conclude that the best way to glue the array - use http_build_query and str_replace

Solution 4 - Php

I would use serialize() or json_encode().

While it won't give your the exact result string you want, it would be much easier to encode/store/retrieve/decode later on.

Solution 5 - Php

Using 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

Solution 6 - Php

You could use PHP's array_reduce as well,

$a = ['Name' => 'Last Name'];

function acc($acc,$k)use($a){ return $acc .= $k.":".$a[$k].",";}

$imploded = array_reduce(array_keys($a), "acc");

Solution 7 - Php

There is also var_export and print_r more commonly known for printing debug output but both functions can take an optional argument to return a string instead.

Using the example from the question as data.

$array = ["item1"=>"object1", "item2"=>"object2","item-n"=>"object-n"];

Using print_r to turn the array into a string

This will output a human readable representation of the variable.

$string = print_r($array, true);
echo $string;

Will output:

Array
(
    [item1] => object1
    [item2] => object2
    [item-n] => object-n
)

Using var_export to turn the array into a string

Which will output a php string representation of the variable.

$string = var_export($array, true);
echo $string;

Will output:

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

Because it is valid php we can evaluate it.

eval('$array2 = ' . var_export($array, true) . ';');
var_dump($array2 === $array);

Outputs:

bool(true)

Solution 8 - Php

Change

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

if you want to resive the entire String without the last $glue

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

And the usage:

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

Solution 9 - Php

For debugging purposes. Recursive write an array of nested arrays to a string. Used foreach. Function stores National Language characters.

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

Solution 10 - Php

Here is a simple example, using class:

$input = array(
    'element1'  => 'value1',
    'element2'  => 'value2',
    'element3' =>  'value3'
);

echo FlatData::flatArray($input,', ', '=');

class FlatData
{

    public static function flatArray(array $input = array(), $separator_elements = ', ', $separator = ': ')
    {
        $output = implode($separator_elements, array_map(
            function ($v, $k, $s) {
                return sprintf("%s{$s}%s", $k, $v);
            },
            $input,
            array_keys($input),
            array_fill(0, count($input), $separator)
        ));
      return $output;
    }

}

Solution 11 - Php

For create mysql where conditions from array

$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'))

Solution 12 - Php

Using explode to get an array from any string is always OK, because array is an always in standard structure.

But about array to string, is there any reason to use predefined string in codes? while the string SHOULD be in any format to use!

The good point of foreach is that you can create the string AS YOU NEED IT! I'd suggest still using foreach quiet readable and clean.

$list = array('a'=>'1', 'b'=>'2', 'c'=>'3');

$sql_val = array();
foreach ($list as $key => $value) {
	$sql_val[] = "(" . $key . ", '" . $value . "') ";
}
$sql_val = implode(', ', $sql_val);

with results:

(a, '1') , (b, '2') , (c, '3') 

|

(a: '1') , (b: '2') , (c: '3') 

|

a:'1' , b:'2' , c:'3' 

etc.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questiontom91136View Question on Stackoverflow
Solution 1 - PhpsteweView Answer on Stackoverflow
Solution 2 - PhpYoshiView Answer on Stackoverflow
Solution 3 - PhpMaxim TkachView Answer on Stackoverflow
Solution 4 - PhpMadara's GhostView Answer on Stackoverflow
Solution 5 - PhpShiplu MokaddimView Answer on Stackoverflow
Solution 6 - PhpsapenovView Answer on Stackoverflow
Solution 7 - Phpnickl-View Answer on Stackoverflow
Solution 8 - PhpBjörnView Answer on Stackoverflow
Solution 9 - PhpSergey YurichView Answer on Stackoverflow
Solution 10 - PhpIvan FerrerView Answer on Stackoverflow
Solution 11 - PhpAjay PatidarView Answer on Stackoverflow
Solution 12 - PhpSaghachiView Answer on Stackoverflow