【问题标题】:Compare and combine multidimensional array then sort descending PHP比较和组合多维数组,然后对 PHP 进行降序排序
【发布时间】:2020-07-22 05:17:49
【问题描述】:

我有 2 个这样的多数组、配置文件和编码数组

    $profiles = array(
        array(
            'user_id'      => 'fcc3d884-fbef-438a-9c86-0ad52c9b1223',
            'first_name'   => 'Narñia',
            'middle_name'  => 'Ñ',
            'last_name'    => 'Cruz',
            'ext'          => ''
        ),
        array(
            'user_id'      => '0d31557d-1e9f-4db3-ac0d-72e1709fe89c',
            'first_name'   => 'Randy',
            'middle_name'  => 'O',
            'last_name'    => 'Rocker',
            'ext'          => ''
        ),
        array(
            'user_id'      => '0f93f169-cf56-49df-a76b-7596446104c6',
            'first_name'   => 'Qwerty',
            'middle_name'  => 'K',
            'last_name'    => 'Asdfg',
            'ext'          => ''
        ),
        array(
            'user_id'      => '23b1f4a2-034c-43b4-96b7-3191d78cead1',
            'first_name'   => 'Johny',
            'middle_name'  => 'L',
            'last_name'    => 'Walker',
            'ext'          => ''
        )
    );

    $encoded = array(
        array(
            'encoder_id' => '0d31557d-1e9f-4db3-ac0d-72e1709fe89c',
            'fullname'   => 'Randy O. Rocker',
            'encoded'    => 10,
        ),
        array(
            'encoder_id' => '23b1f4a2-034c-43b4-96b7-3191d78cead1',
            'fullname'   => 'John L. Walker',
            'encoded'    => 20,
        )
    );

现在我想从 $profiles 获取一些数据,然后在 user_idencoder_id 匹配时合并到 $encoded 数组,我有这个代码,但它似乎只是错误的获取“John L. Waler”数据。这是我的代码。

    $data = [];
    foreach ($profiles as $key => $val) {
        $user_id = $val['user_id'];

        foreach($encoded as $k => $v){
            $ext_name = ($val['ext'] == '') ? '' : $val['ext'];
            $fullname = $val['first_name'].' '.substr($val['middle_name'], 0, 1).'. '.$val['last_name'].' '.$ext_name;
            $data[$key] = array(
                'id'       => ($v['encoder_id'] == $user_id) ? $v['encoder_id'] : $user_id,
                'fullname' => ($v['encoder_id'] == $user_id) ? $v['fullname'] : $fullname,
                'encoded'  => ($v['encoder_id'] == $user_id) ? $v['encoded'] : 0
            );
        }
    }

    echo '<pre>';
    print_r($data);
    echo '</pre>';

这是结果

    Array
    (
        [0] => Array
            (
                [id] => fcc3d884-fbef-438a-9c86-0ad52c9b1223
                [fullname] => Narñia �. Cruz 
                [encoded] => 0
            )

        [1] => Array
            (
                [id] => 0d31557d-1e9f-4db3-ac0d-72e1709fe89c
                [fullname] => Randy O. Rocker 
                [encoded] => 0 //this should be 10
            )

        [2] => Array
            (
                [id] => 0f93f169-cf56-49df-a76b-7596446104c6
                [fullname] => Qwerty K. Asdfg 
                [encoded] => 0
            )

        [3] => Array
            (
                [id] => 23b1f4a2-034c-43b4-96b7-3191d78cead1
                [fullname] => John L. Walker
                [encoded] => 20
            )

    )

在将它们组合成一个新数组之后也是如此。我想通过“编码”属性降序对新数组进行排序。 谢谢理解

【问题讨论】:

    标签: php arrays sorting multidimensional-array


    【解决方案1】:

    您可以通过使用array_column 通过encoder_id 值重新索引$encoded 数组来让您的生活更轻松;那么您不必每次都搜索数组来查找user_id 值,您可以使用isset。提取数据后,您可以使用usortencoded 值排序:

    $encoded_ids = array_column($encoded, null, 'encoder_id');
    
    $data = array();
    foreach ($profiles as $profile) {
        $user_id = $profile['user_id'];
        if (isset($encoded_ids[$user_id])) {
            $data[] = array('id' => $user_id,
                            'fullname' => $encoded_ids[$user_id]['fullname'],
                            'encoded' => $encoded_ids[$user_id]['encoded']
                            );
        }
        else {
            $data[] = array('id' => $user_id,
                            'fullname' => "${profile['first_name']} ${profile['middle_name']} ${profile['last_name']}",
                            'encoded' => 0
                            );
        }
    }
    
    usort($data, function ($a, $b) { return $b['encoded'] - $a['encoded'];});
    print_r($data);
    

    输出:

    Array
    (
        [0] => Array
            (
                [id] => 23b1f4a2-034c-43b4-96b7-3191d78cead1
                [fullname] => John L. Walker
                [encoded] => 20
            )    
        [1] => Array
            (
                [id] => 0d31557d-1e9f-4db3-ac0d-72e1709fe89c
                [fullname] => Randy O. Rocker
                [encoded] => 10
            )    
        [2] => Array
            (
                [id] => fcc3d884-fbef-438a-9c86-0ad52c9b1223
                [fullname] => Narñia Ñ Cruz
                [encoded] => 0
            )    
        [3] => Array
            (
                [id] => 0f93f169-cf56-49df-a76b-7596446104c6
                [fullname] => Qwerty K Asdfg
                [encoded] => 0
            )    
    )
    

    Demo on 3v4l.org

    【讨论】:

    • @p3ac3 别担心 - 我很高兴能帮上忙。
    • 使用array_combine 和仅仅使用array_column($encoded, null, 'encoder_id') 重新索引有什么区别吗?
    • @Jeto 什么都没有!我永远忘记了array_column 的用法。感谢您指出,我已经更新了答案。
    【解决方案2】:

    Nick 版本的替代方案,使用array_reduce

    $encodedByEncoderId = array_column($encoded, null, 'encoder_id');
    
    $combined = array_reduce($profiles, function (array $combined, array $profile) use ($encodedByEncoderId): array {
      $combined[] = [
        'id' => $profile['user_id'],
        'fullname' => $encodedByEncoderId[$profile['user_id']]['fullname'] 
          ?? "{$profile['first_name']} {$profile['middle_name']}. {$profile['last_name']}",
        'encoded' => $encodedByEncoderId[$profile['user_id']]['encoded'] 
          ?? 0
      ];
      return $combined;
    }, []);
    

    演示:https://3v4l.org/kKBru

    【讨论】:

    • 这不太一样,当user_id 值存在于$encoded 数组中时,OP 从该数组中获取fullname,而不是$profiles 数组(John L. Walker而不是Johny L. Walker)。您只需要另一个空合并运算符...
    • 哦,没想到名字不一样。这有点奇怪。已修复,谢谢指出。
    【解决方案3】:

    试试这个!

    $data = [];
    foreach ($profiles as $key => $val) {
        $user_id = $val['user_id'];
        $is_matched = 0;
        $encoded_data = [];
    
        foreach($encoded as $k => $v){
            if ($user_id == $v['encoder_id']) {
                $is_matched = 1;
                $encoded_data = $v;
            }
        }
        $ext_name = ($val['ext'] == '') ? '' : $val['ext'];
        $fullname = $val['first_name'].' '.substr($val['middle_name'], 0, 1).'. '.$val['last_name'].' '.$ext_name;
        $data[$key] = array(
            'id'       => ($is_matched == 1) ? $encoded_data['encoder_id'] : $user_id,
            'fullname' => ($is_matched == 1) ? $encoded_data['fullname'] : $fullname,
            'encoded'  => ($is_matched == 1) ? $encoded_data['encoded'] : 0
        );
    }
    

    【讨论】:

    • 我的荣幸! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 2019-07-23
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多