【问题标题】:Search in a multidimensional assoc array在多维关联数组中搜索
【发布时间】:2016-03-28 15:15:54
【问题描述】:

我有一个数组,如下所示:

[lund] => Array
    (
        [69] => foo
    )

[berlin] => Array
    (
        [138] => foox2
    )

[tokyo] => Array
    (
        [180] => foox2
        [109] => Big entrance
        [73] => foo
    )

问题是有重复的键,所以我重新排列它们以便我可以更具体地搜索,​​我想。

以前我可以

$key = array_search('foo', $array);

要拿到钥匙,但现在不知道怎么弄。

问题:我需要来自tokyo 的值的密钥foo。我该怎么做?

【问题讨论】:

  • 你知道什么,键 tokyo 和值或只有值(可能导致重复...)?
  • 所以您需要上次搜索的项目?
  • 我知道tokyo 和foox2 和Big entrance 和foo,但不知道它们的密钥。例如,我想在 tokyo 中搜索值为 foo 的键。
  • 所以在数组的一部分中使用array_search 来获取内键:$key = array_search('foo', $array['tokyo']);
  • 你可以在array_search函数中硬编码索引tokyo

标签: php multidimensional-array


【解决方案1】:

您需要遍历数组,因为在这种情况下它是二维的。然后找到对应的值。

foreach($arr as $key1 => $key2 ) {
      foreach($key2 as $k => $value) {
        if($value == "foo") {
            echo "{$k} => {$value}";
        }
    }
}

此示例将键与$value 匹配,但您也可以与$k 匹配,在本例中为$key2。

【讨论】:

    【解决方案2】:

    你可以使用这个来获得foo中的所有keys和value:

    foreach ($array as $key => $value) {
        $newArr[$key] = array_search('foo', $value);
    }
    print_r(array_filter($newArr)); 
    

    结果是:

    Array
    (
        [lund] => 69
        [tokyo] => 109
    )
    

    如果您不介意硬代码,可以使用以下代码:

    array_search('foo', $array['tokyo']);
    

    这只是一个简单的示例,您可以根据需要对其进行修改。

    【讨论】:

      【解决方案3】:

      由于问题:我需要价值 foo 的密钥,来自东京。我该怎么做?

      $key = array_search('foo', $array['tokyo']);
      

      作为一个函数:

      function getKey($keyword, $city, $array) {
          return array_search($keyword, $array[$city]);
      }
      // PS. Might be a good idea to wrap this array in an object and make getKey an object method.
      

      如果您想获取所有城市(例如遍历它们):

      $cities = array_keys($array);
      

      【讨论】:

        【解决方案4】:

        试试这个

        $a = array(
                "land"=> array("69"=>"foo"),
                "land1"=> array("138"=>"foo1"),
                "land2"=> array('180' => 'foox2',
                '109' => 'Big entrance',
                '73' => 'foo'),
            );
        //print_r($a);
        $reply = search_in_array($a, "foo");
        print_r($reply);
        
        
        function search_in_array($a, $search)
        {
            $result = array();
            foreach($a as $key1 => $array ) {
                  foreach($array as $k => $value) {
                    if($value == "$search") {
                        array_push($result,"{$key1}=>{$k}");
                        breck;
                    }
                }
            }
            return $result;
        }
        

        【讨论】:

          【解决方案5】:

          如果未找到搜索值,此函数将返回键或 null。

          function search($searchKey, $searchValue, $searchArr)
          {
              foreach ($searchArr as $key => $value) {
                  if ($key == $searchKey && in_array($searchValue, $value)) {
                      $results = array_search($searchValue, $value);
                  }
              }
          
              return isset($results) ? $results : null;
          }
          // var_dump(search('tokyo', 'foo', $array));
          

          【讨论】:

            【解决方案6】:

            试试这个:

            <?php
            error_reporting(E_ALL | E_STRICT);
            ini_set('display_errors', 'On');
            
            
            $array=array("lund" => array
            (
                69 => "foo"
            ),
            
            "berlin" => array
            (
                138 => "foox2"
            ),
            
            "tokyo" => array
            (
                180 => "foox2",
                109 => "Big entrance",
                73 => "foo"
            ));
            
            
            
            function search($array, $arrkey1, $arrvalue2){
            
              foreach($array as $arrkey=>$arrvalue){
            
                 if($arrkey == $arrkey1){
            
                  foreach($arrvalue as $arrkey=>$arrvalue){
            
                    if(preg_match("/$arrvalue/i",$arrvalue2))
                       return $arrkey;
            
                     }
            
                   }     
            
                 }
            
            
               }
            
               $result=search($array, "tokyo", "foo"); //$array=array; tokyo="inside array to check"; foo="value" to check
               echo $result;
            

            【讨论】:

              【解决方案7】:

              我使用数组迭代器创建了解决方案。看看下面的解决方案:

              $array = array(
                  'lund' => array
                  (
                      '69' => 'foo'
                  ),
              
                  'berlin' => array
                  (
                      '138' => 'foox2'
                  ),
              
                  'tokyo' => array
                  (
                      '180' => 'foox2',
                      '109' => 'Big entrance',
                      '73' => 'foo'
                  )
              );
              
              $main_key = 'tokyo'; //key of array
              $search_value = 'foo'; //value which need to be search
              
              $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
              
              foreach ($iterator as $key => $value) {
                  $keys = array();
                  if ($value == $search_value) {
                      $keys[] = $key;
                      for ($i = $iterator->getDepth() - 1; $i >= 0; $i--) {
                          $keys[] = $iterator->getSubIterator($i)->key();
                      }
              
                      $key_paths = array_reverse($keys);
                      if(in_array($main_key, $key_paths) !== false) {
                          echo "'{$key}' have '{$value}' value which traverse path is: " . implode(' -> ', $key_paths) . '<br>';
                      }
                  }
              }
              

              您可以根据您的参数更改$main_key 和$serch_value 的值。希望这会对你有所帮助。

              【讨论】:

                【解决方案8】:
                <?php
                $lund = [
                    '69' => 'foo'
                ];
                $berlin = [
                    '138' => 'foox2'
                ];
                $tokyo = [
                    '180' => 'foox2',
                    '109' => 'Big entrance',
                    '73' => 'foo'
                ];
                $array = [
                    $lund,
                    $berlin,
                    $tokyo
                ];
                
                echo $array[2]['180']; // outputs 'foox2' from $tokyo array
                ?>
                

                【讨论】:

                  【解决方案9】:

                  如果您想通过specific key 和value 获得key,那么您的代码应该是:

                  function search_array($array, $key, $value)
                  {
                      if(is_array($array[$key])) {
                          return array_search($value, $array[$key]);
                      }
                  }
                  
                  echo search_array($arr, 'tokyo', 'foo');
                  

                  【讨论】:

                    猜你喜欢
                    • 2014-08-12
                    • 1970-01-01
                    • 2020-04-16
                    • 1970-01-01
                    • 2014-10-23
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多