2011-03-01 50 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