2011-04-27 111 views
0

嗨,我有一个多维关联数组:PHP搜索多维关联数组的键和返回键=>值

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

我需要能够搜索到关于“BookX” $数组,然后返回的内容'BookX'。

我用尽:

function array_searcher($needles, $array) 
    { 
    foreach ($needles as $needle) { 

    foreach ($array as $key) 
     { 

      if ($key == $needle) 
       { 
       echo $key; 
       } 

     } 
     } 
    } 

与搜索

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

但这并不返回任何

+0

通过使用解决:的foreach($数组作为$密钥=> $值) – BobFlemming 2011-04-27 13:58:44

+0

的回答这个问题,而无需构建嵌套循环张贴响应于http://stackoverflow.com/questions/5806245/php-array-push-multidimensional-associative-array-to-maintain-structure – 2011-04-27 15:37:14

回答

1

如果你要搜索使用这些键,您应该将它作为键=>值对来访问。 如果你不这样做,它只会检索值。

function array_searcher($needles, $array) 
{ 
    foreach ($needles as $needle) 
    { 
     foreach ($array as $key => $value) 
     { 
      if ($key == $needle) 
      { 
       echo $key; 
      } 
     } 
    } 
} 
6

我可能是误会,但是这只是听起来像存取。如果不是,你能澄清吗?

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

echo $array['Book1']; 

编辑:我没有误解你的目标。我对做两个foreach循环有评论。虽然这确实有效,但当您拥有非常大的干草堆阵列时,性能会受到影响。我建议使用isset()进行测试,如果在干草堆阵列中存在针。

我修改了该函数以返回找到的结果数组,以从输出到stdout中删除任何性能命中。我跑到下面的性能测试,虽然它可能不会做同样的搜索一遍又一遍,指出了做两个foreach循环的效率低下,当你的阵列(S)大:

function array_searcher($needles, $array) { 

    $result = array(); 

    foreach ($needles as $needle) { 
     foreach ($array as $key => $value) { 
      if ($key == $needle) { 
       $result[$key] = $value; 
      } 
     } 
    } 

    return $result; 
} 

function array_searcher2($needles, $array) { 

    $result = array(); 

    foreach ($needles as $needle) { 
     if (isset($array[$needle])) { 
      $result[$needle] = $array[$needle]; 
     } 
    } 

    return $result; 
} 

// generate large haystack array 
$array = array(); 
for($i = 1; $i < 10000; $i++){ 
    $array['Book'.$i] = array('http://www.google.com', $i+20); 
} 

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

$start = microtime(true); 
for ($i = 0; $i < 1000; $i++) { 
    array_searcher($needles, $array); 
} 
echo (microtime(true) - $start)."\n"; 
// 14.2093660831 

$start = microtime(true); 
for ($i = 0; $i < 1000; $i++) { 
    array_searcher2($needles, $array); 
} 
echo (microtime(true) - $start)."\n"; 
// 0.00858187675476 
+0

谢谢对不起,我没有解释,但$ needle数组可以是任何大小,并有任何值。有时候,坐在这里,重新输入代码,这是有道理的,我需要'foreach($ array为$ key)'为'foreach'($ array为$ key => $ value)' – BobFlemming 2011-04-27 13:58:05

+0

@Bob,编辑在我重读您的问题并正确理解之后。 – 2011-04-27 15:18:54