PHP의 배열에서 특정 값의 인덱스 가져 오기


87

배열이 있습니다.

$list = array('string1', 'string2', 'string3');

주어진 값에 대한 인덱스를 얻고 싶습니다 (예 : 1for string22for string3)

내가 원하는 것은 배열의 문자열 위치입니다.

  • string1은 0입니다.
  • string2는 1입니다.
  • string3은 2입니다.

이것을 달성하는 방법?


8
기술 작가 친구는 "올바른 질문을하지 않으면 올바른 답을 얻을 수 없습니다."라고 말했습니다.
Bill Karwin 2010 년

이 오래된 .... 그런데 왜 내가 알고 싶은 고원 : "나는 array_search 시도했지만 아무 소용이 없었다"
dsdsdsdsd

더 높은 등급의 답변을 수락 된 것으로 표시하십시오.
robsch

당신이 연관 배열이 있다면 내가했던 것처럼,이 답변이 도움이 : stackoverflow.com/a/3365793/470749
라이언

답변:


159

array_search 그것을하는 방법입니다.

array_search ( mixed $needle , array $haystack [, bool $strict = FALSE ] ) : mixed

로부터 문서 :

$array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red');

$key = array_search('green', $array); // $key = 2;
$key = array_search('red', $array);   // $key = 1;

배열을 수동으로 반복하고 인덱스를 찾을 수 있지만 그에 대한 함수가있을 때 왜 그렇게합니까? 이 함수는 항상 키를 반환하며 연관 및 일반 배열에서 잘 작동합니다.


11
인덱스가 아닌 키를 반환합니다. 귀하의 예에서 키는 편리하게 값의 색인입니다.
Jorge Ferreira

1
@smink, OP의 배열은 비 연관 배열이므로 잘 작동합니다.
Matthew Flaschen

죄송합니다. 배열 유형을 지정하지 않았습니다. 배열 내가 사용하는 솔루션에 대한 내 대답을 참조하십시오 다차원 배열
Aakash Chakravarthy을

이 유형의 배열이 있습니다. [0 => {id : 1, name : something}, 1 => {.....}, ...]. 이것이 array_search ( "name"=> something, $ array) 같은 키 / 인덱스를 찾을 수 있습니까?
lazzy_ms

배열에 자식이 있으면 어떻습니까?
zukijuki

19

그중 몇 가지만 수행하고 (또는 배열 크기가 큰 경우) array_search를 사용하여 올바른 길을 가고있는 것입니다.

$list = array('string1', 'string2', 'string3');
$k = array_search('string2', $list); //$k = 1;

모두 (또는 많이) 원하는 경우 루프가 더 잘할 수 있습니다.

foreach ($list as $key => $value) {
    echo $value . " in " . $key . ", ";
}
// Prints "string1 in 0, string2 in 1, string3 in 2, "

1
foreach 문은 내가 필요한 것입니다
zzapper

11

다른 사람들은 array_search()값이 발견되는 배열 요소의 키를 제공하는 것을 제안했습니다 . 다음을 사용하여 배열 키가 연속적인 정수인지 확인할 수 있습니다 array_values().

$list = array(0=>'string1', 'foo'=>'string2', 42=>'string3');
$index = array_search('string2', array_values($list));
print "$index\n";

// result: 1

당신은 당신의 질문에서 쓸모 array_search()가 없다고 말했습니다 . 이유를 설명해 주시겠습니까? 당신은 무엇을 시도했고 그것이 당신의 필요를 어떻게 충족시키지 못했습니까?


"array_values ​​() was no use".. "array_search () was no use"여야합니다.
Vex

7

// 또는 배열 구조 고려 :

$array = array(
  'string1' => array('a' => '', 'b' => '', 'c' => ''),
  'string2' => array('a' => '', 'b' => '', 'c' => ''),
  'string3' => array('a' => '', 'b' => '', 'c' => ''),
);

// 그냥

function findIndexOfKey($key_to_index,$array){
  return array_search($key_to_index,array_keys($array));
}

// 실행 됨

print "\r\n//-- Method 1 --//\r\n";
print '#index of: string1 = '.findIndexofKey('string1',$array)."\r\n";
print '#index of: string2 = '.findIndexofKey('string2',$array)."\r\n";
print '#index of: string3 = '.findIndexofKey('string3',$array)."\r\n";

// 또는

print "\r\n//-- Method 2 --//\r\n";
print '#index of: string1 = '.array_search('string1',array_keys($array))."\r\n";
print '#index of: string2 = '.array_search('string2',array_keys($array))."\r\n";
print '#index of: string3 = '.array_search('string3',array_keys($array))."\r\n";

// 재귀 적으로

print "\r\n//-- Method 3 --//\r\n";
foreach(array_keys($array) as $key => $value){
  print '#index of: '.$value.' = '.$key."\r\n";
}

// 출력

//-- Method 1 --//
#index of: string1 = 0
#index of: string2 = 1
#index of: string3 = 2

//-- Method 2 --//
#index of: string1 = 0
#index of: string2 = 1
#index of: string3 = 2

//-- Method 3 --//
#index of: string1 = 0
#index of: string2 = 1
#index of: string3 = 2

6

문제는 배열에 숫자 인덱스가 없다는 것입니다.
array_values ​​()를 사용하면 인덱스가 0 인 배열이 생성되고 for 루프를 사용할 필요없이 array_search ()를 사용하여 검색 할 수 있습니다.

$list = array('string1', 'string2', 'string3');
$index = array_search('string2',array_values($list));

이것은 지금까지 그렇게 질문에 대한 짧은 및 가공 한 방법입니다
토니 Tegar Sahidi

1

좀 더 구체적으로 말씀해 주시겠습니까?

$key = array_search('string2',$list)

나를 위해 잘 작동합니다. 좀 더 복잡한 것을 성취하려고하십니까?


1

이 코드는 올바른 다차원 배열을 사용하여 새 루틴과 동일하게 작동해야합니다.

 $arr = array(
  'string1' => array('a' => '', 'b' => '', 'c' => ''),
  'string2' => array('a' => '', 'b' => '', 'c' => ''),
  'string3' => array('a' => '', 'b' => '', 'c' => '')
 );

 echo 'Index of "string2" = '. array_search('string2', array_keys($arr));

1
질문은 다차원 배열에 대해 언급하지 않습니다 (다른 답변의 OP의 의견은이 답변이 실제로 찾고 있던 것임을 시사하지만 원래 질문 과이 답변 만 읽으면 의미가 없습니다)
StubbornShowaGuy

1

이를 위해 함수를 만들어야합니다. 그 목적을위한 내장 함수가 없다고 생각합니다. 모든 PHP 배열은 기본적으로 연관됩니다. 따라서 키에 대해 확실하지 않은 경우 코드는 다음과 같습니다.

<?php

$given_array = array('Monday' => 'boring',
'Friday' => 'yay',
'boring',
'Sunday' => 'fun',
7 => 'boring',
'Saturday' => 'yay fun',
'Wednesday' => 'boring',
'my life' => 'boring');

$repeating_value = "boring";

function array_value_positions($array, $value){
    $index = 0;
    $value_array = array();
        foreach($array as $v){
            if($value == $v){
                $value_array[$index] = $value;
            }
        $index++;
        }
    return $value_array;
}

$value_array = array_value_positions($given_array, $repeating_value);

$result = "The value '$value_array[0]' was found at these indices in the given array: ";

$key_string = implode(', ',array_keys($value_array));

echo $result . $key_string . "\n";//Output: The value 'boring' was found at these indices in the given array: 0, 2, 4, 6, 7


0

array_keys PHP 함수를 사용해보십시오.

$key_string1 = array_keys($list, 'string1');

그 매개 변수가 반전 되지 않습니까?
ashleedawg

@ashleedawg 아니 당신이 오독이는 array_keys서로 다른입니다array_search
친구

0

array_search가 제대로 작동해야합니다. 방금 테스트 한 다음 예상대로 키를 반환합니다.

$list = array('string1', 'string2', 'string3');
echo "Key = ".array_search('string1', $list);
echo " Key = ".array_search('string2', $list);
echo " Key = ".array_search('string3', $list);

또는 색인의 경우 다음을 사용할 수 있습니다.

$list = array('string1', 'string2', 'string3');
echo "Index = ".array_search('string1', array_merge($list));
echo " Index = ".array_search('string2', array_merge($list));
echo " Index = ".array_search('string3', array_merge($list));

0
$find="Topsite";
$list=array("Tope","Ajayi","Topsite","Infotech");
$list_count=count($list);
sort($list);
for($i=0;$i<$list_count;$i++)
{
    if($list[$i]==$find){
         $position=$i;
    }

}
echo $position;

-1

다음은 숫자 또는 문자열 인덱스에서 작동하는 함수입니다. 배열을 첫 번째 매개 변수로 전달한 다음 이동해야하는 요소에 인덱스를 전달하고 마지막으로 방향을 -1로 설정하여 요소를 위로 이동하고 1로 설정하여 아래로 이동합니다. 예 : Move ([ 'first'=> 'Peter', 'second'=> 'Paul', 'third'=> 'Kate'], 'second',-1)는 Paul을 위로, Peter를 아래로 이동시킵니다.

function Move($a,$element,$direction)
{

$temp = [];
$index = 0;

foreach($a as $key=>$value)
{
    $temp[$index++] = $key;
}

$index = array_search($element,$temp);

$newpos = $index+$direction;

if(isset($temp[$newpos]))
{
        $value2 = $temp[$newpos];
        $temp[$newpos]=$element;
        $temp[$index]=$value2;
}
else
{
    # move is not possible
    return $a; # returns the array unchanged
}   

$final = [];

foreach($temp as $next)
{
    $final[$next]=$a[$next];
}

return $final;

}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.