18

ループなしで特定の位置にある位置配列の要素keyとを取得する方法。valuen

想像

$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' 
    

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

配列のようなものfseekがうまくいくと確信しています..しかし、それが存在するかどうかはわかりません

4

4 に答える 4

17

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

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

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

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

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

もちろん、キーにアクセスする必要はありませんが、次のようにするだけで済みます。

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

これは、実行時に配列のコピーをメモリに作成しないことを前提として、おそらくこれを行うための最も安価な方法であり(この要素を調査中)、任意のキーに複数回アクセスするための最良の方法である可能性があります。

于 2013-02-26T16:18:06.230 に答える
6

あなたが望むことは不可能です。PHPの配列には、キーによる効率的なアクセスがありますが、オフセットによる効率的なアクセスはありません。順序はリンクリストとしてのみ利用可能であるため、期待できる最高の効率は、配列を通過してオフセットを探すO(n)ループです。

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

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

于 2013-02-26T16:19:25.573 に答える
3

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

$keys = array_keys($array);

$value_3=$array[$keys[3]];
于 2013-02-26T16:18:20.857 に答える
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";
}

そのタスクに内破する必要はありません

于 2013-02-26T16:16:32.213 に答える