webentwicklung-frage-antwort-db.com.de

Wie implodiere ich ein Array mit Schlüssel und Wert ohne foreach in PHP

Ohne foreach , Wie kann ich ein Array so drehen

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

zu einer Schnur wie dieser

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

Ich habe bereits über implode() nachgedacht, aber der Schlüssel wird damit nicht implodiert.

Wenn es foreach notwendig ist, ist es möglich, das foreach nicht zu nisten? 

EDIT: Ich habe die Zeichenfolge geändert


EDIT2/UPDATE: Diese Frage wurde vor einiger Zeit gestellt. Zu dieser Zeit wollte ich alles in eine Zeile schreiben, so dass ich ternäre Operatoren und eingebaute Funktionsaufrufe für foreach verwenden würde. Das war keine gute Praxis! Schreiben Sie Code, der lesbar ist, egal, ob er knapp ist oder nicht.

In diesem Fall: Das Foreach in eine Funktion zu setzen, ist viel lesbarer und modularer als das Schreiben eines Einzeilers (obwohl alle Antworten großartig sind!).

87
tom91136

und ein anderer Weg:

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

oder:

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

Sie könnten http_build_query wie folgt verwenden:

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

Ausgabe:

item1=object1, item2=object2 

Demo

150
stewe

Ich habe Messungen durchgeführt (100000 Iterationen). Wie kann ich ein assoziatives Array am schnellsten verkleben?

Ziel: Um eine Zeile mit 1.000 Elementen zu erhalten, in diesem Format: "key: value, key2: value2"

Wir haben Array (zum Beispiel):

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

Test Nummer eins:

Verwenden Sie http_build_query und str_replace :

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

Durchschnittliche Zeit zum Implodieren von 1000 Elementen: 0.00012930955084904

Test Nummer zwei:

Verwenden Sie array_map und implode :

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

Durchschnittliche Zeit zum Implodieren von 1000 Elementen: 0.0004890081976675

Test Nummer drei:

Verwenden Sie array_walk und implode :

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

Durchschnittliche Zeit zum Implodieren von 1000 Elementen: 0.0003874126245348

Test Nummer vier:

Verwenden Sie foreach :

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

Durchschnittliche Zeit zum Implodieren von 1000 Elementen: 0.00026632803902445

Ich kann daraus schließen, dass der beste Weg, das Array zu verkleben - http_build_query und str_replace verwendet

23
Maxim Tkach

Ich würde serialize() oder json_encode() verwenden.

Die genaue Ergebniszeichenfolge wird zwar nicht angegeben, aber Sie können später viel einfacher kodieren/speichern/abrufen/dekodieren.

7
Madara Uchiha

array_walk verwenden

$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

3
Shiplu Mokaddim

Veränderung 

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

wenn Sie den gesamten String ohne den letzten $ Glue erhalten möchten

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

Und die Verwendung:

$str = key_implode($yourArray, ",");
2
Björn

Zum Debuggen. Rekursives Schreiben eines Arrays verschachtelter Arrays in einen String . Wird für foreach verwendet. Funktion speichert landessprachliche Zeichen.

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";
}
2
Sergey Yurich

Zum Erstellen von mysql wo Bedingungen aus dem 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'))
1
Ajay Patidar

Es gibt auch var_export und print_r , die allgemein für das Drucken von Debug-Ausgaben bekannt sind. Beide Funktionen können jedoch ein optionales Argument verwenden, um stattdessen einen String zurückzugeben.

Verwenden Sie das Beispiel aus der Frage als Daten.

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

Verwenden Sie print_r, um das Array in einen String zu verwandeln

Dies gibt eine für den Menschen lesbare Darstellung der Variablen aus.

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

Wird ausgeben:

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

Verwenden Sie var_export, um das Array in einen String zu verwandeln

Welches wird eine PHP-String-Darstellung der Variablen ausgeben.

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

Wird ausgeben:

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

Da es gültiges PHP ist, können wir es auswerten.

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

Ausgänge:

bool(true)
0
nickl-

Sie könnten auch PHP array_reduce verwenden,

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

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

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

Hier ist ein einfaches Beispiel mit 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;
    }

}
0
Ivan Ferrer