【问题标题】:PHP multidimensional array search by value using another valuePHP多维数组使用另一个值按值搜索
【发布时间】:2021-11-27 04:37:01
【问题描述】:

我需要获取不同的 'uid' 及其对应的 'name' ,如何在多维数组中做到这一点?

$userdb = array(
array(
    'uid' => '100',
    'name' => 'Sandra Shush',
    'pic_square' => 'urlof100'
),
array(
    'uid' => '5465',
    'name' => 'Stefanie Mcmohn',
    'pic_square' => 'urlof100'
),
array(
    'uid' => '5465',
    'name' => 'Jane Doe',
    'pic_square' => 'urlof100'
),
array(
    'uid' => '40489',
    'name' => 'Michael',
    'pic_square' => 'urlof40489'
), 
array(
    'uid' => '40489',
    'name' => 'Jane Doe',
    'pic_square' => 'urlof40489'
));

样本输出:

$data = [{uid: '100', name: 'Sandra Shush'},{uid: '5465', name: ['Stefanie Mcmohn','Jane Doe']}, {uid: '40489', name: ['Michael','Jane Doe']}]

尝试使用 array_columns 和 array_keys,但我想不出正确的方法。

【问题讨论】:

    标签: php arrays multidimensional-array


    【解决方案1】:

    尝试这样的事情,这里我将 uid 存储到一个数组中,并使用 in_array 函数检查它是否已经在数组中可用

    <?php
    $userdb = array(
        array(
            'uid' => '100',
            'name' => 'Sandra Shush',
            'pic_square' => 'urlof100'
        ),
        array(
            'uid' => '5465',
            'name' => 'Stefanie Mcmohn',
            'pic_square' => 'urlof100'
        ),
        array(
            'uid' => '40489',
            'name' => 'Michael',
            'pic_square' => 'urlof40489'
        ),
        array(
            'uid' => '40489',
            'name' => 'Jane Doe',
            'pic_square' => 'urlof40489'
            ));
    $newUserDb = array();
    
    $arrayUserId=array();
    foreach ($userdb as $user) {
      $newUserDbSingle=array();
      $nameArray=array();
        if (in_array($user['uid'], $arrayUserId))
        {
          $key = array_search ($user['uid'], $arrayUserId);
          $nameArray=$newUserDb[$key]['name'];
          array_push($newUserDb[$key]['name'], $user['name']);
          
        }
        else
        {
          unset($user['pic_square']);
          $arrayUserId[]=$user['uid'];
          $newUserDbSingle=$user;
          $newUserDbSingle['name']=array($user['name']);
          $newUserDb[]=$newUserDbSingle;
        }
    }
    print_r($newUserDb);
    ?>
    

    【讨论】:

    • 谢谢,这行得通。但我如何才能将 $newUserDb 限制为仅 uid 和名称?在您的解决方案中,“pic_square”仍包含在数组 $newUserDb
    • @caia 更新了我的答案
    【解决方案2】:

    试试这个解决方案:

    $data = [];
    
    foreach($userdb as $user)
    {
        if(array_key_exists($user['uid'], $data))
        {
            array_push($obj->name, $user['name']);
        }
        else
        {
            $obj = new stdClass;
    
            $obj->uid = $user['uid'];
            $obj->name = [];
            
            array_push($obj->name, $user['name']);
            $data[$user['uid']] = $obj;
        }
    }
    
    print_r($data);
    

    【讨论】:

      【解决方案3】:

      我有这个功能非常接近您的需求,只需根据您的要求修改返回即可。祝你好运

      function array_searchRecursive($needle, $haystack, $strict = false, $path = array()) {
          if (!is_array($haystack)) {
              return false;
          }
          foreach ($haystack as $key => $val) {
              if (is_array($val) && $subPath = array_searchRecursive($needle, $val, $strict, $path)) {
                  $path = array_merge($path, array($key), $subPath);
                  return $path;
              } elseif ((!$strict && $val == $needle) || ($strict && $val === $needle)) {
                  $path[] = $key;
                  return $path;
              }
          }
          return false;
      }
      

      【讨论】:

        【解决方案4】:

        您可以尝试以下方法:

        $userdb = array(
            array(
                'uid' => '100',
                'name' => 'Sandra Shush',
                'pic_square' => 'urlof100'
            ),
            array(
                'uid' => '5465',
                'name' => 'Stefanie Mcmohn',
                'pic_square' => 'urlof100'
            ),
            array(
                'uid' => '40489',
                'name' => 'Michael',
                'pic_square' => 'urlof40489'
            ),
            array(
                'uid' => '40489',
                'name' => 'Jane Doe',
                'pic_square' => 'urlof40489'
                ));
        $nameArray = [];
        $myUuid = '40489';
        foreach ($userdb as $user) {
            if ($myUuid == $user['uid']) {
                array_push($nameArray, $user['name']);
            }
        }
        print_r($nameArray);
        

        此外,您可以从foreach 循环中从上述数组中获取任何参数或您需要的任何内容。

        【讨论】:

        • 嗨@PHPGeek,我修改了我的示例输出。为混乱道歉。你还能帮我解决这个问题吗?
        • 好的意思是按单个数组中带有名称的 id 分组。对吗?
        • 是的,没错。
        猜你喜欢
        • 2011-10-03
        • 1970-01-01
        • 1970-01-01
        • 2017-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-20
        相关资源
        最近更新 更多