2016-05-16 76 views
1

定的数组中提取关键我们有看起来像这样从“价值”

<?php 
    $list = array(
     'liquid'=>array('water','soft drink'), 
     'solid'=>array('car','computer','floor'), 
     'gas'=>array('air','oxygen','carbon dioxide'), 
    ); 
?> 

数组现在这只是一个例子列表,我们正在努力实现的是

用户通过这样

<?php 
    function return_state($matter_value){ 
     return array_search($matter_value, $list); 
    } 
?> 
  • 用户函数中的值传递water结果应该是理屈ID
  • 用户通过floor结果应该是固体
总之无论用户是通过它将返回它

但是当我们正在执行相关的关键

这个函数,它返回''(空值)。

我们做错了什么?

+1

你也应该得到一个错误,告诉您$列表不存在,因为它超出范围为你的函数,所以你需要将它传递给函数作为参数 –

+0

然后使用foreach循环遍历每个顶级数组的值,并做你的array_search,只有在发现匹配时才返回 –

+0

@runningmark,你需要检查答案[Frayne Konok](http://stackoverflow.com/questions/37248607/extracting- key-from-given-array-with-value/37248736#37248736) –

回答

2

只是foreach循环与in_array让一切变得简单。

$list = array(
     'liquid'=>array('water','soft drink'), 
     'solid'=>array('car','computer','floor'), 
     'gas'=>array('air','oxygen','carbon dioxide'), 
    ); 
function return_state($matter_value, $list){  
    foreach($list as $key => $val){ 
     if(in_array($matter_value, $val)) 
      return $key;   
    } 
    return 'Not found.'; 
} 

echo return_state('floor', $list); //solid 

通过函数调用传递你的数组。

+0

避免使用'global'变量。将列表作为函数的参数传递。 –

+0

我只关注OP。 Okey答案将被更新。 –

0

array_search无法在内部数组中找到。它将查看主阵列,即液体,固体,气体及其值(不是阵列)。您需要通过主阵列的键循环搜索键。

<?php 
    function return_state($matter_value,$list){ 
     foreach($list as $key=>$item){ 
      $test=array_search($matter_value, $item); 
      if($test!==FALSE){ 
       return $key; 
      } 
     } 
    } 
?> 
1

使用foreach环和in_array功能:

function return_state($matter_value = ""){ 
    $list = [ 
     'liquid' => ['water','soft drink'], 
     'solid' => ['car','computer','floor'], 
     'gas' => ['air','oxygen','carbon dioxide'], 
    ]; 
    if (!empty($matter_value)) { // avoids empty arguments 
     foreach ($list as $key => $items) { 
      if (in_array($matter_value, $items)) { 
       return $key; 
      } 
     } 
    } 
    return false; 
} 

print_r(return_state("water")); // "liquid" 
print_r(return_state("floor")); // "solid" 
+0

'trim'返回修剪后的字符串。你应该把它分配给'matter_value'变量,否则函数调用是没有用的。分配后可以使用'empty'功能确保字符串不为空 –

+1

@MateiMihai,改为'empty',谢谢 – RomanPerekhrest

0

这是另一个解决方案。它使matter_value成为一个数组,并将其与$ list数组的每个元素相交。如果没有匹配,结果将是null

function return_state($matter_value, $list) { 
    foreach ($list as $list_item_key => $list_item) { 
     if (! empty(array_intersect([$matter_value], array_values($list_item)))) { 
      return $list_item_key; 
     } 
    } 
}