PHP에서 정수 인덱스로 연관 배열에 접근하기


93

키 / 값 쌍의 배열 인덱스를 사용하여 연관 배열의 값을 설정하고 싶습니다. 예를 들면 :

$my_arr = array( "bling" => "some bling", "bling2" => "lots O bling" );
$my_arr[1] = "not so much bling";  // Would change the value with key bling2.

키 문자열을 사용하지 않고 어떻게이 작업을 수행 할 수 있습니까?

답변:


189

array_keys를 사용하십시오 .

$keys = array_keys($my_arr);
$my_arr[$keys[1]] = "not so much bling";

도움이 되었기를 바랍니다.


4
부수적으로 PHP 개발자가 배열에 접근하는 직관적이지 않은 방법을 만드는 이유는 무엇입니까?
Marty

3
@Marty 이것은 PHP 개발자가 구현하는 방법과는 관련이 없지만 배열 작동 방식에 대한 오해와 관련이 있습니다. 기술적으로 위는 여전히 연관 이름을 사용하고 있습니다. 숫자 키와 연관 색인 키 간에는 상관 관계가 없습니다.
Gordon

2
찾고있는 것이 배열에서의 위치보다 더 중요하기 때문에 연관 배열을 작성합니다. 좋은 점이라고 생각합니다. 학생 이름을 키로, 주소를 값으로 포함하는 배열이 있다고 가정 해 보겠습니다. 이름으로 학생의 주소에 도달 할 수 있습니다. 배열의 위치는 관련이 없습니다. 그리고 배열을 name of the student.
Donovan

@Gordon은 기술적으로 사실입니다. 그러나 프로그래머는 문자열이 아닌 숫자를 제공합니다. 이것이의 의미라고 생각합니다 without using a key string.
Donovan

2
@Albert이 번호를 적절한 키 문자열에 매핑하고 있습니다. array[1] === $array['foo']그래도 그 의미는 아닙니다. 배열은에 다른 값을 포함 할 수 있습니다 $array[1]. 귀하의 솔루션이 잘못되었다고 말하는 것이 아닙니다. OP의 가정입니다.
Gordon

27

숫자 키와 연관 색인 키 사이에는 상관 관계가 없습니다.

key / value의 배열 인덱스를 사용하여 연관 배열의 값설정 하려면 주어진 키를 사용해야하며 설정 $array[1]은 setting과 동일하지 않습니다 $array['foo'].

이 배열 고려

print_r( array('foo', 'foo' => 'bar', 'baz', 'some' => 'value') );

이것은 줄 것이다

Array
(
    [0] => foo
    [foo] => bar
    [1] => baz
    [some] => value
)

foo는 배열의 두 번째 요소입니다. 이것이 offset 이지만 인덱스 1과는 아무런 관련이 없습니다. 보시다시피 위의 배열에서 인덱스 1은 baz. foo첫 번째 연관 키 이기 때문에 실제 숫자 키 1과 관련이 있다고 가정하는 것은 잘못되었습니다 some.

마찬가지로 위에 표시된 것과 같은 혼합 배열의 array_keys경우이 사이트의 다른 곳에서 제안 된 솔루션 이 작동하지 않습니다.

print_r( array_keys(array('foo', 'foo' => 'bar', 'baz', 'some' => 'value')) );

줄게

Array
(
    [0] => 0
    [1] => foo
    [2] => 1
    [3] => some
)

그래서 당신이 $array[$keys[1]]할 때 당신 은 정말로하고 $array['foo']있습니다. 당신이 그 배열 (의 두 번째 연관 값에 액세스하고 싶어하지만 'some'), 당신은 할 수 없어 $array[$keys[2]]그로 평가하기 때문 $array[1]와의 것을 baz.

요소의 오프셋은 키 또는 값과 완전히 관련이 없습니다.

print_r(
    array(
        100    => 'foo',
        'foo'  => 'bar',
        50     => 'baz',
        'some' => 'value'
    )
);

정말 의미

Array
( //key       value     offset/position
    [100]  => foo       // 0
    [foo]  => bar       // 1
    [50]   => baz       // 2
    [some] => value     // 3
)

즉, 오프셋 0의 요소는 키가 100이지만 foo입니다. 오프셋으로 배열에서 요소를 추출하려면 다음을 사용해야합니다.

$third = array_splice($array, 2, 1);
echo $third[0]; // baz

이렇게하면 세 번째 위치에 요소 만있는 배열이 생성됩니다.

또는 ArrayIterator. ArrayIterator구현하는 Seekable특정 위치로 탐색 할 수 있습니다 인터페이스는 / 배열의 오프셋 (offset)하고 있음을 가져 오기 :

$iterator = new ArrayIterator($array);
$iterator->seek(3);
echo $iterator->current(); // value

Minor nit : "해당 배열의 두 번째 연관 값 ( 'some')에 액세스하려면 $ array [$ keys [2]]를 수행 할 수 없습니다. $ array [1]로 평가되고 baz입니다." 기술적으로, 이는 숫자 키를 포함한 모든 키가 연관 키 이기 때문 array_keys입니다.. "비 연관 키"와 같은 엔티티는 없습니다. 두 번째 문자열 키를 반환 할 수 없다는 것을 지적하려는 경우 (키 배열에 문자열 만 포함되어 있다고 가정하여) 말한 내용이 정확합니다. $stringKeys = array_filter(array_keys($array), "is_string");문자열 키를 제공합니다.
ToolmakerSteve

17

array_keys()n 번째 키에 대한 액세스를 허용 하는 동안 array_valuesn 번째 값을 제공합니다.

<?php
$array = [
   0     => 'Zero',
   '1'   => 'One',
   'Two' => 'Two',
];
echo array_values($array)[2];
?>

'Two'를 출력합니다.

하나의 장점이 다른 것보다 있습니까? 내가 볼 수있는 유일한 사소한 것은 어레이 액세스 수입니다.

array_keys()당신 과 함께 3.

  1. 데이터 배열에서 키를 가져옵니다.
  2. 키 목록에서 n 번째 키를 가져옵니다.
  3. 데이터 배열에서 n 번째 키를 사용하여 값을 가져옵니다.

와 함께 array_values(), 당신은 단지 2가 필요합니다.

  1. 데이터 배열에서 값을 가져옵니다.
  2. 값 목록에서 n 번째 값을 가져옵니다.

그러나 반면에 키는 일반적으로 더 작고 데이터가 크게 중첩 될 수 있으므로 균형 적으로를 사용하는 array_keys()것이 더 안전 할 수 있습니다.


3

어레이는 큰 두 경우 array_keysarray_values그들이 단지 얻기 위하여 원본과 새로운 배열과 동일한 사이즈를 할당하기 때문에 낭비가 될 것이다 n 번째의 키 (또는 값).

array_slice정수 오프셋을 허용하고 연관 배열에서 작동합니다. 이를 사용 하여 일정한 시간에 n 번째 키 를 가져오고 설정할 수 있습니다 .

// This will at most allocate 2 temporary arrays of 1 element each
$key = array_keys(array_slice($array, $n, 1, true))[0];

$array[$key] = $value;

2
여기에 좋은 해결책!
Daan

1

이 시도. 그것은 당신을 위해 작동합니다.

$result= array_values($my_arr); // Array with indexes you need

1
이미 여러 개의 답변과 수락 된 답변이있는 이전 스레드에 게시 할 때는주의하세요. 새로운 답변이 기존 답변보다 나은 이유를 설명해야합니다.
APC

0

또 다른 가능성은 일반 배열로 변환하는 것입니다.

$ arraybuff = implode ( "~~~", $ my_arr);
$ my_arr = explode ( "~~~", $ arraybuff);

여기서 "~~~"는 데이터에서 발생하지 않는 구분 기호입니다.

이제 오프셋과 동일한 숫자 인덱스를 사용하여 배열에 액세스 할 수 있습니다.

여전히 연관 배열을 유지해야하는 경우 다른 변수에 할당하기 만하면됩니다.


항상 그리고 항상 고려해야하기 때문에이 정확한 구분 기호가 데이터에 나타날 수 있으므로이 아이디어는 99.9999999 %에서 작동합니다. 100 % 작동하는 몇 가지 솔루션이 있습니다. 게다가, 이것은 프로세서를 많은 작업으로 설정하고 단순한 어레이 액세스를 위해 메모리를 낭비합니다.
user426486
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.