Decir que tengo una serie $input
, que contiene algo como esto:¿Mantener elementos pares de una matriz?
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)
Quiero conseguir una matriz $output
, que contendría la siguiente:
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)
La matriz $output
contiene la mitad de los valores que estaban en $input
; los que tenían claves numeradas en la entrada; el primero se mantiene, segundo no es, tercero es, y por lo que uno ...
(Nota: las claves no se conservan, sólo los valores son importantes)
Cómo podría Haz eso ? ¿Manteniendo solo uno en dos valores de la matriz?
que ya han intentado algunas ideas, y ya tienen un par de diferentes soluciones:
primera idea: iterar sobre la matriz de entrada, y copiar los valores interesantes para la matriz de salida:
$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));
segunda idea: iterar sobre la matriz, y unset
lo que no quiero seguir:
$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));
tercera idea: utilizar un Combinaison de 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));
Cuarta idea: de lo mismo, pero 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));
¿Alguna otra idea? Incluso/particularmente si suena un poco hacky o algo?
Mi objetivo no es obtener la sintaxis más eficiente ni simple; es solo por diversión y porque tengo curiosidad, en realidad ^^
Si el título no está utilizando las palabras adecuadas para describir lo que quiero, no dude en decirlo; o editarlo:-)
que editaron el título y la descripción del algoritmo un poco de lo solicitado. Personalmente, usaría la primera idea: es simple y bastante claro lo que estás haciendo. –
Gracias por las ediciones :-) Bueno, en realidad, "¿cómo puedo hacer eso sin bucles?" Es una pregunta que surgió en el trabajo hace un par de días; un colega y lo pensé ... y finalmente usamos la solución "para" (la primera que di): menos divertido, pero más fácil de entender cuando alguien tendrá que mantener nuestro código, y ese es uno de los más algo importante en nuestro trabajo; pero, todavía era una pregunta interesante, y pensé que podría obtener algunas proposiciones divertidas/interesantes aquí ^^ –
+1 para preguntas bien formuladas con ideas propias – PatrikAkerstrand