Ho un array associativo $assoc
, e la necessità di ridurre a una stringa, in questo contestoarray_reduce() non può funzionare come "riduttore" di array associativi per PHP?
$OUT = "<row";
foreach($assoc as $k=>$v) $OUT.= " $k=\"$v\"";
$OUT.= '/>';
Come fare in an elegant way la stessa cosa, ma utilizzando array_reduce()
Vicino lo stesso algoritmo (prestazioni inferiori e minore leggibilità) con la funzione array_walk()
,
array_walk( $row, function(&$v,$k){$v=" $k=\"$v\"";} );
$OUT.= "\n\t<row". join('',array_values($row)) ."/>";
Ugly soluzione array_map()
(e ancora una volta come join()
riduttore):
$row2 = array_map(
function($a,$b){return array(" $a=\"$b\"",1);},
array_keys($row),
array_values($row)
); // or
$OUT ="<row ". join('',array_column($row2,0)) ."/>";
PS: a quanto pare PHP di array_reduce()
non supporta gli array associativi (perché ??).
array_reduce() non si preoccupa se la matrice è associativa o enumerato, o anche un mix, quindi non diffondere FUD .... o fornire un esempio genuino dove fallisce .... nota che il callback è puramente valori, che è il comportamento documentato, che non è la stessa cosa che non supporta gli array associativi –
@ MarkBaker sì, la funzione è onesta su "nessun accesso all'indice corrente del valore corrente" ... E su altri linguaggi ([come Python] (https://docs.python.org/2/library/functions.html #redu ce)) usa la stessa semantica per * reduce() * ... È meglio visualizzare * reduce() * primo parametro come [attraversabile] (http://php.net/manual/en/class.traversable.php) (non un array), dove sono noti solo * current/next *. –
Non è FUD. Può essere male formulato, ma array_reduce non supporta gli array associativi in modo corretto o completo. Li supporta solo parzialmente, trattandoli come quelli non associativi. L'implementazione per array non associativi di PHP è in realtà un array associativo, ma dal momento che si eliminano le chiavi su array_reduce, non è molto utile quando è necessario un associativo. Questo è il punto. – Asrail