15

どのようにあなたは要素を取得するkeyそしてvalueでのnループなしで特定の位置に配列を配置します。

想像してみて

$postion = 3; // get array at 3rd position
$array = array(
        "A" => "Four",
        "B" => "twp",
        "C" => "three",
        "D" => "Four",
        "E" => "Five",
        "F" => "Four");


$keys = array_keys($array);
$value = array_values($array);

echo implode(array_slice($keys, $postion, 1)), PHP_EOL; // Key at 3rd posstion
echo implode(array_slice($value, $postion, 1)), PHP_EOL; // Value at n position

出力

D
Four

方法の問題点は

  • 配列の多重複製によりメモリ使用量が増加

なぜループを使わないのか

  • 複数の位置を複数回取得する必要があります。大規模なデータセットをループするのも効率的ではありません。

データベースを使わない理由

  • はい、Redisのようなメモリベースのデータベースで作業すると、作業が楽になりますが、特定のアレイの最適化です。

なぜ使わないの?SplFixedArray

  • これは解決策だったでしょうが、私は正のキーを使用していないので私は私がフォローしています(私は本当にこれはphpの部分でも公平ではありません)

    Fatal error: Uncaught exception 'InvalidArgumentException' 
    with message 'array must contain only positive integer keys' 
    

大規模なデータセットとはどういう意味ですか。

  • この質問にしようとしたときに実際に私はこの問題につまずくPHPでメガアレイを管理するだから見ています1e6または1e7512M memory limit

確かに何かが好きですfseekfor arrayはトリックをするでしょう..しかしそれが存在するかどうかわからない


  • 申し訳ありませんが、取得できません。データコンテナを順序付き(インデックス付き)配列のように動作させる必要がある場合、なぜ最初から連想配列を使用する必要があるのでしょうか。 - raina77ow
  • なぜあなたは使っていますかarray_sliceただの代わりに$keys[$position]? - jeroen
  • @ raina77ow配列はデフォルトで連想配列です - Baba
  • 連想配列で@jeroen、キーは不明です - Baba
  • いいえ、$keys数字キーがある場合は、その前の行にそれを設定するだけです。$keys = array_keys($array);。 - jeroen

4 답변


16

PHP 5.4を想定し、配列を間接参照します。

echo $array[array_keys($array)[$position]];

以前のバージョンでは、2行に分割する必要があります。

$keys = array_keys($array);
echo $array[$keys[$position]];

比較的高価なものだけを呼び出せるようにするために、複数の要素にアクセスする必要がある場合は、5.4以降で2行のアプローチを使用する価値もあります。array_keys()一度機能します。また、間接参照方式では、配列内の特定の位置が存在すると仮定しますが、そうではない可能性があります。それを複数の操作に分割すると、そのエラーケースを処理できます。

もちろん鍵にアクセスする必要はありませんが、単純に実行できます。

echo array_values($array)[$position];
// or
$values = array_values($array);
echo $values[$position];

編集する

ArrayIteratorクラスもあなたのためにこれを行うことができます:

$iterator = new ArrayIterator($array);
$iterator->seek($position);

echo $iterator->key(), " = ", $iterator->current(); // D = Four

これを実行するときにメモリ内に配列のコピーが作成されないことを前提として(これでもまだこの要素を調査している)、これがおそらく最も安価な方法です。


  • OPの問題は、array_keysたとえば、配列に何百万もの項目が含まれている場合などです。繰り返しになりますが、これらすべてのユースケースを理解することはできません。DBではなく、コード内の多数の項目を処理する必要はほとんどありません。 - raina77ow
  • @ raina77owを使用するように更新しましたArrayIteratorしかし、それが単にコピーを下に作成するかどうかはわかりません。その場合は、余計な改善が見られなくなります。 - DaveRandom
  • @DaveRandom私はまだあなたがだまされたと思います...でもArrayObjectシーク....持っていません - Baba

5

あなたが望むことは不可能です。 PHPの配列はキーによる効率的なアクセスを持っていますが、オフセットによる効率的なアクセスを持っていません。順序はリンクリストとしてのみ利用できるので、あなたが望むことができる最も良い効率はO(n)ループです。そして、それはちょうどアレイを通り抜けて、オフセットを探します:

$i = 0;
foreach ($array as $value) {
    if ($i++ === $offset) {
        // found value
    }
}

この操作を高速にしたい場合は、適切な数値順および順次インデックス配列を使用する必要があります。



3

実際には$ values配列は必要ありません。

$keys = array_keys($array);

$value_3=$array[$keys[3]];


0

私はあなたの質問をよく理解していませんが、あなたが立場から鍵と要素を必要とするならば

$position = 3; // get array at 3rd position
$array = array(
        "A" => "Four",
        "B" => "twp",
        "C" => "three",
        "D" => "Four",
        "E" => "Five",
        "F" => "Four");


$keys = array_keys($array);
$values = array_values($array);

if($values[$position] == "Four" && $keys[$position] == "D") {
    echo "All it's Right!\n";
}

あなたはその仕事のために爆縮する必要はありません

リンクされた質問


関連する質問

最近の質問