【问题标题】:Check If In_Array (in Recursive Associative Array)检查 In_Array(在递归关联数组中)
【发布时间】:2012-06-13 07:12:33
【问题描述】:

我有一个类似这样的数组:

array(2) {
  [0]=>
  array(2) {
    ["code"]=>
    string(2) "en"
    ["name"]=>
    string(7) "English"
  }
  [1]=>
  array(2) {
    ["code"]=>
    string(2) "bg"
    ["name"]=>
    string(9) "Bulgarian"
  }
}

如何检查字符串保加利亚语是否是上述数组的一部分,或者语言代码“en”是否是数组的一部分?如果我不必使用 foreach 循环整个数组并将字符串与每个元素['code'] 或 element['name'] 进行比较,那就太好了。

【问题讨论】:

  • 你试过什么,你试过任何代码吗?如果是这样,请将其发布在您的问题中,以便为您提供帮助。
  • 以某种形式,你总是需要一个循环。甚至 in_array 在内部循环。
  • " 如果我​​不必使用 foreach 循环遍历整个数组并将字符串与每个元素进行比较,那就太好了" - 那么您将如何找到你在找吗?
  • @deceze,真的。但这并不意味着我会提倡自定义 foreach 循环而不是 in_array()(当然在适用的情况下)。

标签: php arrays recursion associative-array


【解决方案1】:
// $type could be code or name
function check_in_array($arr, $value, $type = "code") {
  return count(array_filter($arr, function($var) use ($type, $value) {
    return $var[$type] === $value;
  })) !== 0;
}

【讨论】:

  • 这段代码看起来像是到处抛出未定义的变量警告。我想知道 TS 是如何让它发挥作用的。如果发现,您也应该提前退出。没有必要数大于一。
  • 另一个 var 丢失了,仍然想知道提前退出,我会说 foreach 在这里还不错。
  • @hakre 是的,foreach 在这里更好,只是显示其他方式
  • 我的经验是这适用于PHP 5.3.1,但不适用于5.2.17
【解决方案2】:

我知道我的代码使用了 foreach,但它很容易理解和使用。

$language=array();
$language[0]['code']='en';
$language[0]['name']='English';
$language[1]['code']='bg';
$language[1]['name']='Bulgaria';

var_dump(my_in_array('Bulgaria', $language));

function my_in_array($search, $array) {
    $in_keys = array();
    foreach($array as $key => $value){
        if(in_array($search, $value)){
            $in_keys[]=$key;
        }
    }
    if(count($in_keys) > 0){
        return $in_keys;
    }else{
        return false;
    }
}

【讨论】:

    【解决方案3】:

    您可以使用此函数进行递归搜索

    function in_arrayr($needle, $haystack) {
            foreach ($haystack as $v) {
                    if ($needle == $v) return true;
                    elseif (is_array($v)) return in_array($needle, $v);
            }
            return false;
    } 
    

    或者你可以在你的数组上使用json_encode 并搜索子字符串的出现:)

    【讨论】:

      【解决方案4】:

      我也遇到过类似的问题,所以做了这个函数,和in_array类似,但是可以递归的在数组中查找。我认为这是正确的,但我没有在很多情况下进行测试。 (对不起我的英语我是法国人)

      function in_arrayr($needle, $haystack) {
      if(is_array($haystack)){
          foreach($haystack as $elem){
              $a = in_arrayr($needle,$elem)||$a;
          }
      }
      else{
          $a = (($needle == $haystack)? true: false);
      }
          return $a;
      } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-22
        • 2015-03-29
        • 2014-07-15
        • 2022-12-04
        • 2020-04-27
        相关资源
        最近更新 更多