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\',)
并试图编写一个函数,在其中可以搜索并返回完整保留$ keys和$ values的数组。因此,如果有人在哪里搜索\“ \'Book1 \',\'Book2 \',那么他们将返回一个数组:
   $results = array( \'Book1\' => array(\'http://www.google.com\',))
这个:
$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添加到$ value中。因此它返回:
Book1 => [0]\'Book1details\' 
Book2 => [0]\'Book1details\' [1]\'Book2details\'
Book3 => [0]\'Book1details\' [1]\'Book2details\' [2] \'Book3details\'
等等。 我希望能够做到:
array_push($BookArray,$key=>$value);
但显然那是不可能的。 有任何想法吗?即使它只是我需要的数组函数。     

解决方法

使用基本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\');
编辑2 使用strcasecmp()也可以使用户定义的键比较更加简单。
function key_compare_func($key1,$key2) {
    return strcasecmp($key1,$key2);
}
    ,请改用此逻辑(尽管我不是您要最后一行做的100%吗?)
$BookArray[]=$key;
$bookDetailsarray[]=$value;
$bookArray[]=$bookDetailsarray;