2011-03-01 52 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函數類似array_search,我可以用它來搜索在二維數組的第1列匹配的項目?

  • 失敗了,是否有一個PHP函數將第一列複製到1D數組(同時保持順序),以便我可以調用它的array_search?

+0

我不知道該array_search使用一個高效的算法,它似乎並不關心輸入數組是否是有序的。這意味着它可以是線性搜索,也可以是首先對數組進行排序。 – MattSmith 2011-03-01 03:47:33

回答

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 2011-03-01 11:41:08

6

是否有一個PHP函數類似array_search,我可以用它來搜索在二維數組的第1列匹配的項目?

你可以使用然後給出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,但你使用傳統升回調或更舊版本的PHP

做不到這一點的create_function,有一個PHP函數到第一列複製到一維數組(同時保留順序),所以我可以調用array_search上呢?

請參閱欺騙的第一個選項。我認爲不需要重複一個完美的答案。

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

或者:

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

最明智的解決方案:) – unherz 2017-09-18 08:45:47

0

您可以在陣列轉換使用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

,這個問題就頂在我的谷歌搜索array search column使用的密鑰。我花了一些時間才找到this better answer to the same questionBy 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