Скажем, у меня есть массив $input
, который содержит что-то вроде этого:
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)
Я хочу получить массив $output
, который будет содержать это:
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)
Массив $output
содержит половину значений, которые были в $input
; те, которые даже пронумеровали ключи на входе; первая сохраняется, вторая - нет, третья - одна и т.д....
(Примечание: ключи не сохраняются, важны только значения)
Как я могу это сделать? Сохранение только одного из двух значений массива?
Я уже пробовал некоторые идеи и уже имею пару различных решений:
Первая идея: итерация по входному массиву и копирование интересных значений в выходной массив:
$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));
Вторая идея: итерация по массиву и unset
то, что я не хочу сохранять:
$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));
Третья идея: используйте комбинацию 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));
Четвертая идея: о том же, но с 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));
Любая другая идея? Даже/особенно, если это звучит немного хаки или что-то еще?
Моя цель - не получить самый эффективный и простой синтаксис; это просто для удовольствия и потому, что мне любопытно, на самом деле ^^
Если название не использует правильные слова для описания того, что я хочу, не стесняйтесь рассказывать; или отредактируйте его : -)