Dire che ho una matrice $input
, che contiene qualcosa di simile:Mantenere gli elementi pari di un array?
array
0 => string 'a' (length=1)
1 => string 'b' (length=1)
2 => string 'c' (length=1)
3 => string 'd' (length=1)
4 => string 'e' (length=1)
5 => string 'f' (length=1)
6 => string 'g' (length=1)
7 => string 'h' (length=1)
8 => string 'i' (length=1)
9 => string 'j' (length=1)
voglio ottenere un array $output
, che conterrebbe questo:
array
0 => string 'a' (length=1)
1 => string 'c' (length=1)
2 => string 'e' (length=1)
3 => string 'g' (length=1)
4 => string 'i' (length=1)
L'array $output
contiene la metà dei valori che erano in $input
; quelli che avevano persino numerato le chiavi nell'input; il primo è tenuto, secondo non è, terzo è, e così uno ...
(Nota: non vengono mantenute le chiavi, solo i valori sono importanti)
Come potrei Fai quello ? Mantenere solo uno su due valori dell'array?
Ho già provato alcune idee, e già un paio diverse soluzioni:
Prima idea: iterate sopra la matrice di ingresso, e copiare i valori interessanti per l'array di uscita:
$input = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',);
$output = array();
$nbr = count($input);
for ($i = 0 ; $i < $nbr ; $i += 2) {
$output[] = $input[$i];
}
var_dump(array_values($output));
seconda idea: iterate sopra la matrice, e unset
quello che non voglio tenere:
$input = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',);
$output = $input;
$nbr = count($input);
for ($i = 1 ; $i < $nbr ; $i += 2) {
unset($output[$i]);
}
var_dump(array_values($output));
terza idea: utilizzare un combinaison di array_flip
, range
, array_diff_key
, ...:
$input = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',);
$output = array();
$keys_to_exclude = array_flip(range(1, count($input)-1, 2));
$output = array_diff_key($input, $keys_to_exclude);
var_dump(array_values($output));
quarta idea: circa la stessa cosa, ma con array_intersect_key
:
$input = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',);
$output = array();
$keys_to_include = array_flip(range(0, count($input)-1, 2));
$output = array_intersect_key($input, $keys_to_include);
var_dump(array_values($output));
Qualche altra idea? Anche/particolarmente se suona un po 'hacky o altro?
Il mio obiettivo non è quello di ottenere la sintassi più efficiente né semplice; è solo per divertimento e perché sono curioso, in realtà ^^
Se il titolo non usa le parole giuste per descrivere ciò che voglio, non esitare a dirlo; o modificarla:-)
ho modificato il titolo e la descrizione dell'algoritmo un po 'come richiesto. Personalmente userò la prima idea: è semplice e abbastanza chiaro quello che stai facendo. –
Grazie per le modifiche :-) Beh, in realtà, "come posso farlo senza loop da solo" è una domanda che è comparsa al lavoro un paio di giorni fa; un collega e ci ho pensato ... e alla fine abbiamo usato la soluzione "for" (la prima che ho dato): meno divertente, ma più facile da capire quando qualcuno dovrà mantenere il nostro codice - e questo è uno dei più cosa importante nel nostro lavoro; ma, era ancora una domanda interessante, e ho pensato di ottenere alcune proposte divertenti/interessanti qui ^^ –
+1 per domande ben formulate con le proprie idee – PatrikAkerstrand