że mam $input
tablicę, która zawiera coś takiego:Utrzymanie parzystych elementów tablicy?
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)
Chcę uzyskać $output
tablicę, która zawiera to:
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)
Tablica $output
zawiera połowę wartości, które były w $input
; te, które miały nawet numerowane klucze na wejściu; pierwszy z nich utrzymuje, drugi nie, trzecia to i tak jeden ...
(Uwaga: klucze nie są zachowane, tylko wartości są ważne)
Jak mogłem Zrób to ? Przechowywanie tylko jednej z dwóch wartości tablicy?
Próbowałem już kilka pomysłów, a już kilka różnych rozwiązań:
Pierwszy pomysł: iteracyjne nad tablicy wejściowej i skopiować interesujące wartości do tablicy wyjściowej:
$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));
Drugi pomysł: iteracyjne nad tablicy i unset
czego nie chcesz zachować:
$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));
Trzecia idea: użyć combinaison z 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));
Czwarty pomysł: o to samo, ale z 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));
Każdy inny pomysł? Nawet/szczególnie jeśli brzmi to trochę hacky czy coś?
Moim celem nie jest uzyskanie najbardziej wydajnej ani prostej składni; to tylko dla zabawy i ponieważ jestem ciekawa, właściwie^^
Jeśli tytuł nie używa właściwych słów do opisania tego, czego chcę, nie wahaj się powiedzieć; lub edytować to:-)
edytowany tytuł i opis algorytmu trochę na żądanie. Osobiście użyłbym pierwszego pomysłu - jest to proste i dość jasne, co robisz. –
Dzięki za zmiany :-) Cóż, właściwie "jak mogę to zrobić bez pętli przeze mnie" to pytanie pojawiające się kilka dni temu w pracy; kolega i pomyślałem o tym ... i ostatecznie użyliśmy rozwiązania "for" (pierwszego, które dałem): mniej zabawy, ale łatwiej zrozumieć, kiedy ktoś będzie musiał zachować nasz kod - i to jest jedna z najbardziej ważna rzecz w naszej pracy; ale nadal było to ciekawe pytanie i pomyślałem, że mogę tu dostać zabawne/interesujące propozycje ^^ –
+1 za dobrze sformułowane pytanie z własnymi pomysłami – PatrikAkerstrand