15

어떻게 요소를 얻을 수 있나요?keyvalue에서의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

  • 이것은 솔루션이었을 것이지만 나는 pher 부분에 대해 긍정적 인 키를 사용하지 않았기 때문에 위어를 따라 갔다.

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

대용량 데이터 세트 란 무엇입니까?

확신 해.fseek배열에 대한 트릭을 할 것이라고 ..하지만 그것이 존재하는 경우 확실하지


  • 죄송합니다. 가져올 수 없습니다. 데이터 컨테이너가 정렬 된 (인덱스 된) 배열처럼 동작해야하는 경우, 왜 처음에는 연관 배열을 사용해야합니까? - raina77ow
  • 왜 당신은 사용하고 있습니까?array_slice단지 대신$keys[$position]? - jeroen
  • @ raina77ow 배열은 기본적으로 연관되어 있습니다. - Baba
  • @ 연상 배열과 열쇠는 알 수 없다. - Baba
  • 아니,$keys숫자 키를 가지고 있습니다.$keys = array_keys($array);. - jeroen

4 답변


16

array dereferencing을 사용하여 PHP 5.4를 가정합니다.

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

이전 버전에서는 두 줄로 나누어야합니다.

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

또한 5.4+에서 두 줄 접근법을 사용하는 것이 가치가 있습니다. 여러 요소에 액세스해야만 상대적으로 비싼 곳으로 전화 할 수 있습니다.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";
}

당신은 그 임무에 대한 내파련이 필요 없다.

연결된 질문


관련된 질문

최근 질문