[php] 값으로 PHP 다차원 배열 검색

검색 uid하고 배열의 키를 얻으려는 배열이 있습니다.

다음과 같은 2 차원 배열이 있다고 가정합니다.

$userdb = array(
    array(
        'uid' => '100',
        'name' => 'Sandra Shush',
        'pic_square' => 'urlof100'
    ),
    array(
        'uid' => '5465',
        'name' => 'Stefanie Mcmohn',
        'pic_square' => 'urlof100'
    ),
    array(
        'uid' => '40489',
        'name' => 'Michael',
        'pic_square' => 'urlof40489'
    )
);

함수 호출 search_by_uid(100)(첫 번째 사용자의 UI)은을 반환해야합니다 0.

함수 호출 search_by_uid(40489)은을 반환해야합니다 2.

루프를 만들려고했지만 더 빠른 코드 실행을 원합니다.



답변

function searchForId($id, $array) {
   foreach ($array as $key => $val) {
       if ($val['uid'] === $id) {
           return $key;
       }
   }
   return null;
}

작동합니다. 다음과 같이 호출해야합니다.

$id = searchForId('100', $userdb);

===연산자 비교 유형을 사용하는 경우 정확히 동일한 유형이어야 한다는 것을 알아야합니다 .이 예에서는 검색 string하거나 ==대신 사용해야 합니다 ===.

앙 고루 답변을 기반으로 합니다. 이후 버전의 PHP ( >= 5.5.0)에서는 하나의 라이너를 사용할 수 있습니다.

$key = array_search('100', array_column($userdb, 'uid'));

여기 문서입니다 : http://php.net/manual/en/function.array-column.php .


답변

(PHP 5> = 5.5.0)을 사용하는 경우이 작업을 수행하기 위해 고유 한 기능을 작성할 필요가 없습니다.이 행을 작성하면됩니다.

하나의 결과 만 원하는 경우 :

$key = array_search(40489, array_column($userdb, 'uid'));

여러 결과

$keys = array_keys(array_column($userdb, 'uid'), 40489);

주석에 표시된 연관 배열이있는 경우 다음을 사용하여 만들 수 있습니다.

$keys = array_keys(array_combine(array_keys($userdb), array_column($userdb, 'uid')),40489);

PHP <5.5.0을 사용하는 경우 램지 덕분 에이 백 포트를 사용할 수 있습니다 !

업데이트 : 간단한 벤치 마크를 작성했으며 여러 결과 형식이 Jakub 사용자 정의 기능보다 훨씬 빠릅니다.


답변

이후 버전의 PHP (> = 5.5.0)에서는이 단일 라이너를 사용할 수 있습니다.

$key = array_search('100', array_column($userdb, 'uid'));


답변

Jakub의 훌륭한 답변을 바탕으로 , uid뿐만 아니라 키를 지정할 수있는보다 일반적인 검색이 있습니다.

function searcharray($value, $key, $array) {
   foreach ($array as $k => $val) {
       if ($val[$key] == $value) {
           return $k;
       }
   }
   return null;
}

용법: $results = searcharray('searchvalue', searchkey, $array);


답변

나는 이것이 이미 답변되었다는 것을 알고 있지만, 이것을 사용하고 코드에서 조금 더 확장하여 uid로만 검색하지 않았습니다. 해당 기능이 필요한 다른 사람과 공유하고 싶습니다.

여기 내 예가 있으며 이것이 첫 번째 대답이라는 것을 명심하십시오. 하나의 특정 배열 만 검색하면 되었기 때문에 param 배열을 가져 왔지만 쉽게 추가 할 수있었습니다. 본질적으로 uid 이상으로 검색하고 싶었습니다.

또한 내 상황에서는 고유하지 않을 수있는 다른 필드로 검색 한 결과 반환 할 여러 키가있을 수 있습니다.

 /**
     * @param array multidimensional
     * @param string value to search for, ie a specific field name like name_first
     * @param string associative key to find it in, ie field_name
     *
     * @return array keys.
     */
     function search_revisions($dataArray, $search_value, $key_to_search) {
        // This function will search the revisions for a certain value
        // related to the associative key you are looking for.
        $keys = array();
        foreach ($dataArray as $key => $cur_value) {
            if ($cur_value[$key_to_search] == $search_value) {
                $keys[] = $key;
            }
        }
        return $keys;
    }

나중에 다른 값과 연관 키를 검색 할 수 있도록 이것을 작성했습니다. 따라서 첫 번째 예에서는 특정 연관 키에서 값을 검색하고 모든 일치 항목을 반환 할 수 있습니다.

값 ( ‘테일러’) 어떤 연관 키 (FIRST_NAME)에서 발견되는이 두 번째 예를 보여줍니다 당신 다른 값 (사실은) 다른 연관 키 (고용)에서 발견하고, 모든 일치 (키 반환되는 경우 이름을 가진 사람 ‘테일러’가 사용됩니다).

/**
 * @param array multidimensional
 * @param string $search_value The value to search for, ie a specific 'Taylor'
 * @param string $key_to_search The associative key to find it in, ie first_name
 * @param string $other_matching_key The associative key to find in the matches for employed
 * @param string $other_matching_value The value to find in that matching associative key, ie true
 *
 * @return array keys, ie all the people with the first name 'Taylor' that are employed.
 */
 function search_revisions($dataArray, $search_value, $key_to_search, $other_matching_value = null, $other_matching_key = null) {
    // This function will search the revisions for a certain value
    // related to the associative key you are looking for.
    $keys = array();
    foreach ($dataArray as $key => $cur_value) {
        if ($cur_value[$key_to_search] == $search_value) {
            if (isset($other_matching_key) && isset($other_matching_value)) {
                if ($cur_value[$other_matching_key] == $other_matching_value) {
                    $keys[] = $key;
                }
            } else {
                // I must keep in mind that some searches may have multiple
                // matches and others would not, so leave it open with no continues.
                $keys[] = $key;
            }
        }
    }
    return $keys;
}

기능 사용

$data = array(
    array(
        'cust_group' => 6,
        'price' => 13.21,
        'price_qty' => 5
    ),
    array(
        'cust_group' => 8,
        'price' => 15.25,
        'price_qty' => 4
    ),
    array(
        'cust_group' => 8,
        'price' => 12.75,
        'price_qty' => 10
    )
);

$findKey = search_revisions($data,'8', 'cust_group', '10', 'price_qty');
print_r($findKey);

결과

Array ( [0] => 2 ) 


답변

외모는 array_filter 이 적합한 솔루션이 될 것입니다 …

$userdb=Array
(
    (0) => Array
        (
            (uid) => '100',
            (name) => 'Sandra Shush',
            (url) => 'urlof100'
        ),

    (1) => Array
        (
            (uid) => '5465',
            (name) => 'Stefanie Mcmohn',
            (pic_square) => 'urlof100'
        ),

    (2) => Array
        (
            (uid) => '40489',
            (name) => 'Michael',
            (pic_square) => 'urlof40489'
        )
);

PHP 코드

<?php
$search = 5465;
$found = array_filter($userdb,function($v,$k) use ($search){
  return $v['uid'] == $search;
},ARRAY_FILTER_USE_BOTH) // With latest PHP third parameter is mandatory.. Available Values:- ARRAY_FILTER_USE_BOTH OR ARRAY_FILTER_USE_KEY  

$values= print_r(array_value($found));
$keys =  print_r(array_keys($found)); 


답변

설명 함수 array_search 아래 예제 중 하나를 수정 했습니다 . 함수 searchItemsByKey는 다차원 배열 (N 레벨)에서 $ key로 모든 값을 반환합니다. 아마도 누군가에게 유용 할 것입니다. 예:

 $arr = array(
     'XXX'=>array(
               'YYY'=> array(
                    'AAA'=> array(
                          'keyN' =>'value1'
                   )
               ),
              'ZZZ'=> array(
                    'BBB'=> array(
                          'keyN' => 'value2'
                   )
               )
              //.....
           )
);


$result = searchItemsByKey($arr,'keyN');

print '<pre>';
print_r($result);
print '<pre>';
// OUTPUT
Array
(
  [0] => value1
  [1] => value2
)

기능 코드 :

function searchItemsByKey($array, $key)
{
   $results = array();

  if (is_array($array))
  {
    if (isset($array[$key]) && key($array)==$key)
        $results[] = $array[$key];

    foreach ($array as $sub_array)
        $results = array_merge($results, searchItemsByKey($sub_array, $key));
  }

 return  $results;
}