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

时间:2012-07-06 08:01:39

标签: php arrays

我有一个数组

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

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

2 个答案:

答案 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);