【问题标题】:php switch array key with subelement keyphp用子元素键切换数组键
【发布时间】:2013-08-06 14:34:11
【问题描述】:

我想用子元素键(user_id)切换数组的主键(0,1,2)。

例如,从这个数组中:

    array(3) {
  [0]=>
  array(3) {
    ["num_products_user_by_ref"]=>
    string(1) "1"
    ["user_id"]=>
    string(2) "77"
    ["reference"]=>
    string(3) "E49"
  }
  [1]=>
  array(3) {
    ["num_products_user_by_ref"]=>
    string(1) "9"
    ["user_id"]=>
    string(3) "526"
    ["reference"]=>
    string(3) "E49"
  }
  [2]=>
  array(3) {
    ["num_products_user_by_ref"]=>
    string(2) "38"
    ["user_id"]=>
    string(3) "346"
    ["reference"]=>
    string(3) "E49"
  }
}

我需要:

array(952) {
  [77]=>
  array(2) {
    ["num_products_user_by_ref"]=>
    string(1) "1"
    ["reference"]=>
    string(3) "E49"
  }
  [526]=>
  array(3) {
    ["num_products_user_by_ref"]=>
    string(1) "9"
    ["reference"]=>
    string(3) "E49"
  }
  [346]=>
  array(3) {
    ["num_products_user_by_ref"]=>
    string(2) "38"
    ["reference"]=>
    string(3) "E49"
  }

每个 user_id 可以包含超过 1 对 num_products_user_by_ref/reference。 我记得有一个函数可以实现这个(ksort?)关联到一个自定义函数来实现。

【问题讨论】:

    标签: php arrays sorting key switch-statement


    【解决方案1】:
    $out = array();     
    foreach ($arr as $key => $value){
        $out[$value['user_id']]["num_products_user_by_ref"] = $value["num_products_user_by_ref"]; 
        $out[$value['user_id']]["reference"] = $value["reference"];
    }
    print_r($out);
    

    您的问题显示的结构似乎不符合您的评论“每个 user_id 可能包含超过 1 对 num_products_user_by_ref/reference”。所以,这是另一个允许这种可能性的版本:

    $out = array();     
    foreach ($arr as $key => $value){
        $entry = array("num_products_user_by_ref" => $value["num_products_user_by_ref"],
                        "reference" => $value["reference"]);
        $out[$value['user_id']][] = $entry;
    }
    

    输出:

    Array
    (
        [77] => Array
            (
                [0] => Array
                    (
                        [num_products_user_by_ref] => 1
                        [reference] => E49
                    )
                [1] => Array
                    (
                        [num_products_user_by_ref] => 5
                        [reference] => E49
                    )
            )
        [526] => Array
            (
                [0] => Array
                    (
                        [num_products_user_by_ref] => 9
                        [reference] => E49
                    )
            )
        [346] => Array
            (
                [0] => Array
                    (
                        [num_products_user_by_ref] => 38
                        [reference] => E49
                    )
            )
    )
    

    对于那些不喜欢传统循环的人来说,这是另一个版本:

    $out = array();
    array_walk($arr, function($e, $k) use(&$out){
        $entry = array("num_products_user_by_ref" => $e["num_products_user_by_ref"],
                        "reference" => $e["reference"]);
        $out[$e['user_id']][] = $entry;
    });
    

    【讨论】:

    • 谢谢你的回答佩,真的没有办法实现它whitout循环?
    • @ArnaudNcy 除了循环之外,唯一的其他选项可能是array_walk,但无论如何这本质上是一个循环,而且我认为它的效率较低。我刚刚注意到您对每个用户的多个条目的评论,所以我会更新我的答案。
    • 完美!非常感谢您对我的问题感兴趣!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 2021-04-14
    • 2010-12-29
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多