1

我有一个数组

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

有什么有效的方法,请帮忙。

4

2 回答 2

4

你传入一个 key$from和一个 key $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"
}
于 2012-07-06T08:36:19.907 回答
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);
于 2012-07-06T08:08:27.373 回答