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