获取关联数组的两个键之间的键,值的最有效方法


Most efficient way to get keys,values between two keys of an Associative array

>我有一个数组

$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];

有没有有效的方法,请帮忙。

你传入一个密钥$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"
}

假设您的输入数组具有连续键,为什么不只:

$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);