假设我有一个$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)
Run Code Online (Sandbox Code Playgroud)
我想得到一个$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)
Run Code Online (Sandbox Code Playgroud)
该$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));
Run Code Online (Sandbox Code Playgroud)
第二个想法:迭代数组,以及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));
Run Code Online (Sandbox Code Playgroud)
第三个想法:使用的combinaison 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));
Run Code Online (Sandbox Code Playgroud)
第四个想法:关于同样的事情,但有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));
Run Code Online (Sandbox Code Playgroud)
还有其他想法吗?甚至/特别是如果它听起来有点hacky或任何东西?
我的目标不是获得最有效和最简单的语法; 这只是为了好玩,因为我很好奇,实际上是^^
如果标题没有使用正确的词语来描述我想要的东西,请不要犹豫; 或编辑它 :-)
Vol*_*erK 15
<?php
$x = range('a', 'f');
$x = array_map('array_shift',
array_chunk($x, 2)
);
var_dump($x);
Run Code Online (Sandbox Code Playgroud)
或另一个
<?php
class ArrayEvenIterator extends ArrayIterator {
public function next() {
parent::next();
return parent::next();
}
}
$x = range('a', 'f');
$x = iterator_to_array(new ArrayEvenIterator( $x ), false);
var_dump($x);
Run Code Online (Sandbox Code Playgroud)
或者使用php 5.3闭包(在这种情况下不比全局更好;-))
<?php
$x = range('a', 'f');
$x = array_filter( $x, function($e) use(&$c) { return 0===$c++%2; });
var_dump($x);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1577 次 |
| 最近记录: |