2011-04-27 59 views
1

我有一个数组:PHP array_push多维关联数组保持结构

$array= array(
     'Book1' => array('http://www.google.com', '45'), 
     'Book2' => array('http://www.yahoo.com', '46', 
     'Book3' => array('http://www.excite.com', '47',) 

,我试图写一个函数,你可以搜索并与$键和$值不变返回数组。因此,如果有人在何处搜索“‘第一册’,‘第二册’,那么他们还是会回到一个数组:

$results = array('Book1' => array('http://www.google.com', '45'), 'Book2' => array('http://www.yahoo.com', '46',))

此:

$bookArray = array() 
$bookDetailsarray = array(); 

$needles = array('book1' , 'book2'); 

    foreach ($needles as $needle) { 

    foreach ($array as $key => $value) 
     { 

      if ($key == $needle) 
       { 
       array_push($BookArray, $key); 
       array_push($bookDetailsarray, $value); 
       array_push($bookArray, $bookDetailsarray);               
       }    
     } 
    } 


    } 

这工作,但在foreach的每次迭代它不断增加的$ bookDetailsaray到$值,使之返回:。

Book1 => [0]'Book1details' 
Book2 => [0]'Book1details' [1]'Book2details' 
Book3 => [0]'Book1details' [1]'Book2details' [2] 'Book3details' 

我希望能够做到:

array_push($BookArray, $key=>$value); 

但显然这是不可能的。 任何想法?即使它只是我需要的数组函数。

回答

2

稍微更有效的方法使用基本的PHP函数,而不是循环做你的搜索:

$searchArray = array('Book1' => array('http://www.google.com', '45'), 
         'Book2' => array('http://www.yahoo.com', '46'), 
         'Book3' => array('http://www.excite.com', '47') 
        ); 

$needles = array('Book1','Book3'); 

$searchResults = array_intersect_key($searchArray,array_flip($needles)); 

var_dump($searchResults); 

但是请注意,它是区分大小写的

编辑

如果你想不区分大小写的搜索,您可以使用array_intersect_ukey()来替代,使用自定义比较来忽略键的大小写。

function key_compare_func($key1, $key2) { 
    $key1 = strtoupper($key1); 
    $key2 = strtoupper($key2); 

    if ($key1 == $key2) 
     return 0; 
    else if ($key1) > $key2) 
     return 1; 
    else 
     return -1; 
} 

$searchResults = array_intersect_ukey($searchArray, array_flip($needles), 'key_compare_func'); 

EDIT 2

使用strcasecmp()可以让用户自定义键也比较简单了很多。

function key_compare_func($key1, $key2) { 
    return strcasecmp($key1,$key2); 
} 
+0

哇。这很整齐!谢谢 – BobFlemming 2011-04-27 15:29:17

0

使用此逻辑,而不是(虽然,我不是你想的最后一行做什么100%?)

$BookArray[]=$key; 
$bookDetailsarray[]=$value; 
$bookArray[]=$bookDetailsarray;