2011-03-01 6 views
2

내가 배열의 배열을 가지고 있고 나는 첫 번째 열을PHP : 배열의 배열의 첫 번째 "열"에서 검색

데이터를 복사 할은 다음과 같습니다

(0=>"homer", 1=> 1, 2=> 2, 3=> 3) 
(0 => "marge", 1=> 2, 2 => 4, 3=> 8) 
(0 => "bart", 1 => 6, 2 => 2, 3 => 7) 
(0 => "lisa", 1 => 16, 2 => 20, 3 => 71) 

인가가 첫 번째 "열"에서 이름 일치를 검색하는 데 사용할 수있는 PHP 함수 (array_search와 비슷 함)?

첫 번째 열의 데이터가 이미 정렬되어 있으므로 "column1"을 복사 할 수 있으므로 array_search (요소 반복에 의한 순진 요소가 아닌 bsearch를 사용한다고 가정 함)를 수행 할 수있었습니다.

내 질문은 :

  • 하는 PHP 함수가 나는 2 차원 배열의 첫째 열에서 항목을 일치하는 검색하는 데 사용할 수있는 array_search 비슷한 있습니까?

  • 오류가 있습니다. 첫 번째 열을 1D 배열로 복사하는 PHP 함수가 있습니까 (순서를 유지하는 동안). 그래서 array_search를 호출 할 수 있습니까?

+0

내가 array_search 효율적인 알고리즘을 사용하는 확실하지 않다, 그것은하지 않는 것 입력 배열이 정렬되었는지 신경 써야합니다. 즉, 선형 검색이거나 어쨌든 배열을 정렬합니다. – MattSmith

답변

0

PHP는 내가 알고있는 것을 이렇게 좋은 깨끗한 방법이 없습니다. 그러나 배열은 이미 자식 배열의 첫 번째 열에있는 값으로 정렬되므로 이진 검색을 사용하여 직접 할 수 있습니다.

<?php 
// Binary Search Taken By greenmr: 
// http://php.net/manual/en/function.array-search.php#89413 
function array_bsearch($needle, $haystack, $comparator) { 
    $high = Count($haystack) -1; 
    $low = 0; 

    while ($high >= $low){ 
     $probe = Floor(($high + $low)/2); 
     $comparison = $comparator($haystack[$probe], $needle); 
     if ($comparison < 0) { 
      $low = $probe +1; 
     } elseif ($comparison > 0) { 
      $high = $probe -1; 
     } else { 
      return $probe; 
     } 
    } 

    return -1; 
} 

// Compare the needle the first element/column 
function KeyCompare($obj, $needle) { 
    if ($obj[0] < $needle) { 
     return -1; 
    } elseif ($obj[0] > $needle) { 
     return 1; 
    } else { 
     return 0; 
    } 
} 

$arr = array(array(0=>"homer", 1=> 1, 2=> 2, 3=> 3), 
     array(0 => "marge", 1=> 2, 2 => 4, 3=> 8), 
     array(0 => "bart", 1 => 6, 2 => 2, 3 => 7), 
     array(0 => "lisa", 1 => 16, 2 => 20, 3 => 71)); 

$index = array_bsearch('marge', $arr, 'KeyCompare'); 

// prints the array containing marge 
echo print_r($arr[$index]); 
?>  
+0

Egggcellent! ... :) – oompahloompah

6

하는 PHP 함수 I는 2 차원 배열의 첫번째 열에 일치하는 항목을 검색하는 데 사용할 수있는 array_search 유사한 있는가?

당신은 array_filter

$matchedArray = array_filter($myArray, function($x) use ($nameToSearchFor) { 
    return $x[0] == $nameToSearchFor; 
}); 

가 지정 사용할 수 있습니다

$myArray = array(
    array(0=>"homer", 1=> 1, 2=> 2, 3=> 3), 
    array(0 => "marge", 1=> 2, 2 => 4, 3=> 8), 
    array(0 => "bart", 1 => 6, 2 => 2, 3 => 7), 
    array(0 => "lisa", 1 => 16, 2 => 20, 3 => 71), 
); 

$nameToSearchFor = "bart"; 

생산겠습니까 :

$matchedArray === array(0 => "bart", 1 => 6, 2 => 2, 3 => 7); 

나는 closures를 사용하는 것이 한 PHP 5.3에서만 작동합니다. 0,하지만 당신은 전통을 사용합니다. L 콜백 또는 실패 PHP

이전 버전 create_function, 1 차원 배열로 첫 번째 열을 복사하는 PHP 함수 (보존 순서 동안)가 그래서 그것에 array_search 호출 할 수 있을까?

deceze 첫 번째 옵션을 참조하십시오. 나는 완벽하게 좋은 대답을 반복 할 필요가 없다.

4
$oneDarray = array_map(create_function('$a', 'return $a[0];'), $twoDarray); 

또는 :

foreach ($twoDarray as $values) { 
    if ($values[0] == 'homer') { 
     // found! 
     break; 
    } 
} 
+0

가장 스마트 한 솔루션 :) – unherz

0

당신은이 질문은 array search column 내 Google 검색에 상위 온 array_walk

$new_data = array(); 
array_walk($data, create_function('a','$new_data[$a[0]] = $a;')); 
$search_text = 'bart'; 
if (array_key_exists($new_data, $search_text)) { 
    echo "I found '$search_text': ".print_r($new_data[$search_text], true); 
} 
0

를 사용하여 키를 사용하여 배열을 변환 할 수 있습니다 : 다음은이 작업을 수행하는 코드이다. this better answer to the same question을 찾으려면 시간이 걸렸습니다. By Mark M.

당신이 PHP >= 5.5를 사용하는 경우, 당신은 array_keys()array_map()과 함께 새로운 array_column()를> 사용할 수 있습니다.

는 "바트"를 검색하려면,이 질문에 적용에게, 그것은 다음과 같습니다

$array=array(
    array(0=>"homer", 1=> 1, 2=> 2, 3=> 3), 
    array(0 => "marge", 1=> 2, 2 => 4, 3=> 8), 
    array(0 => "bart", 1 => 6, 2 => 2, 3 => 7), 
    array(0 => "lisa", 1 => 16, 2 => 20, 3 => 71)); 

$result = $array[array_search("bart",array_column($array, 0))]; 
print_r($result); 

/* Output: 
    Array 
    (
     [0] => bart 
     [1] => 6 
     [2] => 2 
     [3] => 7 
    ) 
*/ 

Run demo

관련 문제