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

$fromkeyと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 に答える