vacio obtener multidimensional indice elementos elemento ejemplos declarar buscar array agregar php arrays string implode

obtener - foreach php mysql



Cómo implosionar array con clave y valor sin foreach en PHP (10)

Sin foreach , ¿cómo puedo convertir una matriz como esta

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

a una cadena como esta

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

Pensé en implode() ya, pero no implota la clave con él.

Si es necesario, ¿es posible no anidar el foreach?

EDITAR: He cambiado la cadena

EDIT2 / ACTUALIZACIÓN: Hace bastante tiempo se formuló esta pregunta. En ese momento, quería escribir todo en una línea, así que usaría operadores ternarios y anidaría funciones integradas en favor de foreach. ¡Esa no era una buena práctica! Escribir código que sea legible, ya sea conciso o no importa poco.

En este caso: poner el foreach en una función será mucho más legible y modular que escribir una línea (¡aunque todas las respuestas son geniales!).


Aquí hay un ejemplo simple, usando clase:

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


Cambio

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

si quieres resiver toda la cadena sin el último $ de pegamento

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

Y el uso:

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


Para crear mysql donde las condiciones de matriz

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


Para fines de depuración. Recursive escribe una matriz de matrices anidadas en una cadena. Foreach usado. La función almacena caracteres de idioma nacional.

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


Pasé las mediciones (100000 iteraciones), ¿qué forma más rápida de pegar una matriz asociativa?

Objetivo: Obtener una línea de 1,000 artículos, en este formato: "clave: valor, clave2: valor2"

Tenemos array (por ejemplo):

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

Prueba número uno:

Use http_build_query y str_replace :

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

Tiempo promedio para implosionar 1000 elementos: 0.00012930955084904

Prueba número dos:

Usa array_map e implode :

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

Tiempo promedio para implosionar 1000 elementos: 0.0004890081976675

Prueba número tres:

Usa array_walk e implode :

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

Tiempo promedio para implosionar 1000 elementos: 0.0003874126245348

Prueba número cuatro:

Use foreach :

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

Tiempo promedio para implosionar 1000 elementos: 0.00026632803902445

Puedo concluir que la mejor manera de pegar la matriz: use http_build_query y str_replace


Puedes usar http_build_query , así:

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

Salida:

item1=object1, item2=object2

Demo


También puedes usar array_reduce de PHP,

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


Usando 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


Yo usaría serialize() o json_encode() .

Si bien no le dará la cadena de resultados exacta que desea, sería mucho más fácil codificar / almacenar / recuperar / descodificar más adelante.


y otra forma:

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

o:

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