我有一个数组
$var = array("one"=>"one","two"=>"two","three"=>"three","four"=>"four");
如果我传递了密钥one,three
,我希望用密钥获取值one , two ,three
。
现在我正在做的是
$new_array = array_diff(array_slice($var,$key1),array_slice($var,$key2));
$new_array[$key1] = $var[$key1];
$new_array[$key2] = $var[$key2];
有没有有效的方法,请帮助。
答案 0 :(得分:4)
您传入了密钥$from
和密钥$to
。要让从 - 到工作,您还需要了解订单。您可以使用array_keys
获得密钥的顺序:
$keys = array_flip(array_keys($array));
现在,您可以找到$from
和$to
键的偏移量:
array_slice($array, $keys[$from], $keys[$to] - $keys[$from] + 1);
编译为完整示例:
<?php
/**
* Most efficient way to get keys,values between two keys of an Associative array
* @link http://stackoverflow.com/q/11358192/367456
*/
$array = array("one" => "one", "two" => "two", "three" => "three", "four" => "four");
$slice = function($from, $to) use ($array)
{
$keys = array_flip(array_keys($array));
if (isset($keys[$from]) and isset($keys[$to])) {
return array_slice($array, $keys[$from], $keys[$to] - $keys[$from] + 1);
}
throw new InvalidArgumentException('Invalid from and/or to key.');
};
var_dump($slice('one', 'three'));
输出:
array(3) {
["one"]=>
string(3) "one"
["two"]=>
string(3) "two"
["three"]=>
string(5) "three"
}
答案 1 :(得分:3)
假设您的输入数组具有连续的键,为什么不只是:
$newArray = array_slice($array, $key1, $key2 + 1);
修改强>
哦等等,这只会在$key1 = 0
时有效,请尝试这样做:
$newArray = array_slice($array, $key1, ($key2 - $key1) + 1);
这仍然需要$key1 < $key2
,但是根据你的想象,我总是会这样。
另一个编辑
为了在不循环数组的情况下完成此操作(当然是最简单的方式),您需要将字符串键转换为数字,以便它们可以与array_slice()
一起使用。这有效:
$var = array("one"=>"one","two"=>"two","three"=>"three","four"=>"four");
$key1 = 'one';
$key2 = 'three';
$keys = array_keys($var);
$key1index = array_search($key1, $keys);
$key2index = array_search($key2, $keys);
$newArray = array_slice($var, $key1index, ($key2index - $key1index) + 1, TRUE);
print_r($newArray);