【问题标题】:Find values in multidimensional arrays在多维数组中查找值
【发布时间】:2012-05-30 07:35:57
【问题描述】:

我有一个多维数组:

array (
    array (
        "username"        => "foo",
        "favoriteGame"    => "Mario"
    )
    array (
        "username"        => "bar",
        "favoriteGame"    => "Mario"
    )
    array (
        "username"        => "xyz",
        "favoriteGame"    => "Zelda"
    )
)

我怎样才能以最简单的方式获得喜欢玩的人的用户名,例如马里奥?

编辑: 我的错:忘记明确提及“favoriteGame”值是动态的,我无法提前知道它是哪个。

我的解决方案:

foreach($users as $key => $value)
{
    if(!isset($$value['favoriteGame']))
    {
        $$value['favoriteGame'] = array();
    }
    array_push($$value['favoriteGame'], $value['username']);
}

遍历每个子数组并找到它的 favoriteGame 值。 如果还没有数组 $favoriteGame 创建它。 将实际子数组的 username-value 推送到 $favoriteGame 数组。

感谢您的回复,我只是无法正确表达这个问题。

【问题讨论】:

  • 动态是什么意思?它是如何动态设置的?
  • 这个数组是基于用户输入的。所以它可能是马里奥、塞尔达甚至死亡空间。我想显示一个包含玩家一起输入的值的列表(当然,删除重复项)。并 foreach "favoriteGame" 列出作为 "favoriteGame" 输入的用户。

标签: php


【解决方案1】:
function getUsernamesByFavoriteGame($data, $game) {
    $usernames = array();
    foreach($data as $arr) {
        if ($arr['favoriteGame'] == $game) {
            $usernames[] = $arr['username'];
        }
    }
    return $usernames;
}

【讨论】:

    【解决方案2】:
     $usernames = array();
     foreach($array as $key => $value) {
         if ($value['favoriteGame'] == 'Mario') {
             $usernames[] = $value['username'];
         }
     }
    

    【讨论】:

      【解决方案3】:

      我会使用array_filter。如果你有 PHP 5.3 或更高版本,你可以这样做:

      $favorite = "Mario";
      $filter = function($player) use($favorite) { return $player['favoriteGame'] == $favorite; };
      $filtered = array_filter($players, $filter);
      

      旧版本会有所不同,因为您将无法使用 lambda 函数。

      【讨论】:

      • +1 我发现array_filter 在处理多维数组时更容易理解
      【解决方案4】:
       $game = 'Mario';   
       $users = array();
       foreach($array as $key => $value) {
           if ($value['favoriteGame'] == $game) {
               $users[] = $value['username'];
           }
       }
      

      【讨论】:

        【解决方案5】:

        如果您更频繁地使用它,请将数据结构转换为类似的东西。

         array(
           "Mario" => array(
                       "0":"foo",
                       "1":"xyz"
                       )
           "Zelda" => array(
                       "0":"pqr",
                       "1":"abc"
                      )
         )
        

        这将直接为您提供最喜欢的游戏的用户名列表。

        $arr[$favGame]
        

        如果您无法更改数据结构,则建议使用 tigrang。

        【讨论】:

          【解决方案6】:

          我认为你应该实现一个自定义的多维搜索功能。
          看看this answer


          以下是你将如何使用它

          代码 | Live example

          function search($array, $key, $value){
              $results = array();
          
              if (is_array($array))
              {
                  if (isset($array[$key]) && $array[$key] == $value)
                      $results[] = $array;
          
                  foreach ($array as $subarray)
                      $results = array_merge($results, search($subarray, $key, $value));
              }
          
              return $results;
          }
          
          $arr = array (
              array (
                  "username"        => "foo",
                  "favoriteGame"    => "Mario"
              ),
              array (
                  "username"        => "bar",
                  "favoriteGame"    => "Mario"
              ),
              array (
                  "username"        => "xyz",
                  "favoriteGame"    => "Zelda"
              )
          );
          
          print_r(search($arr, 'favoriteGame', 'Mario'));
          
          //OUTPUT
          Array ( 
              [0] => Array ( 
                  [username] => foo 
                  [favoriteGame] => Mario 
              ) 
              [1] => Array ( 
                  [username] => bar 
                  [favoriteGame] => Mario 
              ) 
          ) 
          

          【讨论】:

            【解决方案7】:
            $array = array( 'a' => 'A',
                'b'=>'B',
                'c'=>'C',
                'd'=>array(
                    'e'=>array(
                       'f'=>'D'
                    ),
                    'g'=>array(
                        'h'=>'E'
                    )
                ),
                'i'=>'F',
                'j'=>array(
                    'k'=>'G'
                ),
                'l'=>'H'
            );
            
            $new_array = array();
            foreach($array as $k1=>$v1){
                if(is_array($v1)){
                    $new_array = parseArray($new_array, $k1, $v1);
                }else{
                    $new_array = array_merge($new_array, array($k1=>$v1));
                }
            }
            
            function parseArray($new_array, $key, $val){
                if(is_array($val)){
                    foreach($val as $k2=>$v2){
                        if(is_array($v2)){
                           $new_array = parseArray($new_array, $k2, $v2);
                        }else{
                           $new_array = array_merge($new_array, array($k2=>$v2));
                        }
                    }
                }else{
                    $new_array = array_merge($new_array, array($key=>$val));
                }
                return $new_array;
            }
            

            输出

            Array
            (
                [a] => A
                [b] => B
                [c] => C
                [f] => D
                [h] => E
                [i] => F
                [k] => G
                [l] => H
            )
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-12-13
              • 2015-10-05
              • 2019-10-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多