Hoe een array te imploderen met sleutel en waarde zonder foreach in PHP

Zonder foreach,
hoe kan ik zo’n array omdraaien

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

naar een string als deze

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

Ik dacht al aan implode(), maar het implodeerde de sleutel er niet mee.

Als foreach nodig is, is het dan mogelijk om de foreach niet te nesten?

EDIT:ik heb de tekenreeks gewijzigd


BEWERK2/UPDATE:
Deze vraag is al een tijdje geleden gesteld. Op dat moment wilde ik alles op één regel schrijven, zodat ik ternaire operators zou gebruiken en ingebouwde functieaanroepen zou nesten ten gunste van foreach. Dat was geen goede gewoonte! Schrijf code die leesbaar is, of het nu beknopt is of niet, het maakt niet zoveel uit.

In dit geval: het plaatsen van de foreach in een functie is veel leesbaarder en modulairder dan het schrijven van een one-liner (ook al zijn alle antwoorden geweldig!).


Antwoord 1, autoriteit 100%

Je zou http_build_queryals volgt kunnen gebruiken:

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

Uitvoer:

item1=object1, item2=object2 

Demo


Antwoord 2, autoriteit 91%

en een andere manier:

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

of:

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

Antwoord 3, autoriteit 20%

Ik heb metingen gedaan (100000 iteraties), wat is de snelste manier om een ​​associatieve array te lijmen?

Doelstelling:om een ​​regel van 1.000 items te verkrijgen, in deze indeling: “key:value,key2:value2”

We hebben array (bijvoorbeeld):

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

Test nummer één:

Gebruik http_build_queryen str_replace:

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

Gemiddelde tijd om 1000 elementen te imploderen: 0,00012930955084904

Test nummer twee:

Gebruik array_mapen implode:

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

Gemiddelde tijd om 1000 elementen te imploderen: 0.0004890081976675

Test nummer drie:

Gebruik array_walken implode:

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

Gemiddelde tijd om 1000 elementen te imploderen: 0.0003874126245348

Test nummer vier:

Gebruik foreach:

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

Gemiddelde tijd om 1000 elementen te imploderen: 0.00026632803902445

Ik kan concluderen dat de beste manier om de array te lijmen – http_build_query en str_replace

is


Antwoord 4, autoriteit 4%

Ik zou serialize()of json_encode()gebruiken.

Hoewel het je niet de exacte resultaatreeks geeft die je wilt, zou het later veel gemakkelijker zijn om te coderen/opslaan/ophalen/decoderen.


Antwoord 5

array_walk

gebruiken

$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


Antwoord 6

Je zou ook PHP’s array_reducekunnen gebruiken,

$a = ['Name' => 'Last Name'];
function acc($acc,$k)use($a){ return $acc .= $k.":".$a[$k].",";}
$imploded = array_reduce(array_keys($a), "acc");

Antwoord 7

Er is ook var_exporten print_rbeter bekend voor het afdrukken van foutopsporingsuitvoer, maar beide functies kunnen een optioneel argument gebruiken om in plaats daarvan een tekenreeks terug te geven.

Het voorbeeld uit de vraag als gegevens gebruiken.

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

Gebruik print_rom de array in een string te veranderen

Dit levert een voor mensen leesbare weergave van de variabele op.

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

Zal uitvoeren:

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

var_exportgebruiken om de array in een string te veranderen

Wat een php-tekenreeksrepresentatie van de variabele zal opleveren.

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

Zal uitvoeren:

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

Omdat het een geldige php is, kunnen we het evalueren.

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

Uitgangen:

bool(true)

Antwoord 8

Wijzigen

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

als je de hele string wilt resiveren zonder de laatste $glue

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

En het gebruik:

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

Antwoord 9

Voor foutopsporingsdoeleinden. Recursief schrijven van een array van geneste arrays naar een string.
Foreach gebruikt. Functie slaat tekens in de nationale taal op.

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

Antwoord 10

Hier is een eenvoudig voorbeeld, waarbij klasse wordt gebruikt:

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

Antwoord 11

Voor het aanmaken van mysql waar voorwaarden uit 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'))

Antwoord 12

Exploderen gebruiken om een ​​array uit een willekeurige string te halen is altijd OK, omdat array altijd een standaardstructuur heeft.

Maar over array naar string, is er een reden om vooraf gedefinieerde strings in codes te gebruiken? terwijl de tekenreeks in elk formaat MOET zijn om te gebruiken!

Het goede punt van foreach is dat je de string kunt maken ALS JE HET NODIG HEBT!
Ik raad aan om foreach nog steeds rustig leesbaar en schoon te gebruiken.

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

met resultaten:

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

|

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

|

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

enz.

Other episodes