Php 使用多个值和基于循环和排序数组中的组值的数组和按数组分组

Php 使用多个值和基于循环和排序数组中的组值的数组和按数组分组,php,arrays,sorting,multidimensional-array,Php,Arrays,Sorting,Multidimensional Array,我想对数组值进行分组并找到total(基于按值分组的数组值之和),然后根据total对数组进行排序。我想按基金类型(“私人、VC、其他”)和基金总额(“最后价值”)按用户分组 我已经在这里建立了一个演示链接 然后我想根据总和对数组进行排序 Array ( [Andew] => [0,480,600] [Jon] => [120,110,0] [Walid] => [0,0,160] ) 有谁能提出这个问题的可能解决方案吗 谢谢如果这是数据库查询的结果,那么几乎可以肯定

我想对数组值进行分组并找到total(基于按值分组的数组值之和),然后根据total对数组进行排序。我想按基金类型(“私人、VC、其他”)和基金总额(“最后价值”)按用户分组

我已经在这里建立了一个演示链接

然后我想根据总和对数组进行排序

Array
(
 [Andew] => [0,480,600]
 [Jon] => [120,110,0]
 [Walid] => [0,0,160]
)
有谁能提出这个问题的可能解决方案吗


谢谢

如果这是数据库查询的结果,那么几乎可以肯定,在该查询中可以更有效地执行此操作。但是,您可以分3个阶段获得想要的结果:

  • 按人员和类型分组输入数据
  • 为每个人填写缺少的值
  • 对数组进行排序
  • 输出(用于示例数据):

    请注意,我将内部数组的键保留为关联键,因为这似乎更有用。如果您喜欢数字键,则需要对每个内部数组进行排序,使键的顺序相同,然后获取每个条目的
    array\u值

    $key_rank = array('Private' => 0, 'VC' => 1, 'Other' => 2);
    foreach ($arr as &$person) {
        uksort($person, function ($a, $b) use ($key_rank) {
            return $key_rank[$a] - $key_rank[$b];
        });
        $person = array_values($person);
    }
    
    输出:

    Array
    (
        [Andew] => Array
            (
                [0] => 0
                [1] => 480
                [2] => 600
            )    
        [Jon] => Array
            (
                [0] => 120
                [1] => 0
                [2] => 150
            )    
        [Walid] => Array
            (
                [0] => 0
                [1] => 0
                [2] => 160
            )    
    )
    
    Array
    (
        [0] => Array
            (
                [0] => Andew
                [1] => 0
                [2] => 480
                [3] => 600
            )
        [1] => Array
            (
                [0] => Jon
                [1] => 120
                [2] => 0
                [3] => 150
            )
        [2] => Array
            (
                [0] => Walid
                [1] => 0
                [2] => 0
                [3] => 160
            )
    )
    
    [Demo on 3v4l.org][3]
    

    要以数组的形式将结果与名称和值放在一起,请将最后一段代码替换为:

    $key_rank = array('Private' => 0, 'VC' => 1, 'Other' => 2);
    $result = array();
    foreach ($arr as $name => &$person) {
        uksort($person, function ($a, $b) use ($key_rank) {
            return $key_rank[$a] - $key_rank[$b];
        });
        $result[] = array_merge(array($name), array_values($person));
    }
    
    print_r($result);
    
    输出:

    Array
    (
        [Andew] => Array
            (
                [0] => 0
                [1] => 480
                [2] => 600
            )    
        [Jon] => Array
            (
                [0] => 120
                [1] => 0
                [2] => 150
            )    
        [Walid] => Array
            (
                [0] => 0
                [1] => 0
                [2] => 160
            )    
    )
    
    Array
    (
        [0] => Array
            (
                [0] => Andew
                [1] => 0
                [2] => 480
                [3] => 600
            )
        [1] => Array
            (
                [0] => Jon
                [1] => 120
                [2] => 0
                [3] => 150
            )
        [2] => Array
            (
                [0] => Walid
                [1] => 0
                [2] => 0
                [3] => 160
            )
    )
    
    [Demo on 3v4l.org][3]
    

    @很抱歉我不小心改变了我的分类。看我的edit@Rigal我刚刚做了另一次编辑,为内部数组提供数字键,如果这是您的喜好,非常感谢您的快速帮助。我想要每个数组的对象。IE['Andew',0480600]。@Rigal我的输出正是您在问题中要求的。是的,但我想在对象中转换为显示图表,所以我需要['Andew',0480600],'john',120,0150],'Walid',0,0160]。您能建议我以相同的对象格式转换吗?
    $key_rank = array('Private' => 0, 'VC' => 1, 'Other' => 2);
    foreach ($arr as &$person) {
        uksort($person, function ($a, $b) use ($key_rank) {
            return $key_rank[$a] - $key_rank[$b];
        });
        $person = array_values($person);
    }
    
    Array
    (
        [Andew] => Array
            (
                [0] => 0
                [1] => 480
                [2] => 600
            )    
        [Jon] => Array
            (
                [0] => 120
                [1] => 0
                [2] => 150
            )    
        [Walid] => Array
            (
                [0] => 0
                [1] => 0
                [2] => 160
            )    
    )
    
    $key_rank = array('Private' => 0, 'VC' => 1, 'Other' => 2);
    $result = array();
    foreach ($arr as $name => &$person) {
        uksort($person, function ($a, $b) use ($key_rank) {
            return $key_rank[$a] - $key_rank[$b];
        });
        $result[] = array_merge(array($name), array_values($person));
    }
    
    print_r($result);
    
    Array
    (
        [0] => Array
            (
                [0] => Andew
                [1] => 0
                [2] => 480
                [3] => 600
            )
        [1] => Array
            (
                [0] => Jon
                [1] => 120
                [2] => 0
                [3] => 150
            )
        [2] => Array
            (
                [0] => Walid
                [1] => 0
                [2] => 0
                [3] => 160
            )
    )
    
    [Demo on 3v4l.org][3]