V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ragnaroks
V2EX  ›  PHP

php 中如何将数字索引数组改为键名索引数组

  •  
  •   ragnaroks · 2016-07-21 16:18:29 +08:00 · 5700 次点击
    这是一个创建于 3084 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Array
    (
    [0] => stdClass Object
    (
    [id] => 1
    [k] => AppName
    [v] => 我是应用名称
    [notes] => 应用名称
    )
    [1] => stdClass Object
    (
    [id] => 2
    [k] => AppDescription
    [v] => 我是应用描述
    [notes] => 应用描述
    )
    [2] => stdClass Object
    (
    [id] => 3
    [k] => AppVersion
    [v] => 0.0.1
    [notes] => 应用版本
    )
    )

    如何变为下面这种:

    Array
    (
    [AppName] => stdClass Object
    (
    [id] => 1
    [k] => AppName
    [v] => 我是应用名称
    [notes] => 应用名称
    )
    [AppDescription] => stdClass Object
    (
    [id] => 2
    [k] => AppDescription
    [v] => 我是应用描述
    [notes] => 应用描述
    )
    [AppVersion] => stdClass Object
    (
    [id] => 3
    [k] => AppVersion
    [v] => 0.0.1
    [notes] => 应用版本
    )
    )
    请大神赐教
    第 1 条附言  ·  2016-07-21 17:10:06 +08:00

    $SqlResult=(
        [0]=>(stdClass)
            k->'AppName',
            v->'V2EX',
            notes->'应用名称'
        [1]=>(stdClass)
            k->'AppSite',
            v->'http://www.v2ex.com/',
            notes->'应用网站'
        [2]=>(stdClass)
            k->'AppVersion',
            v->100,
            notes->'应用版本'
    );

    //array_column方法中貌似不能有对象,先转为数组
    $SqlResultArray=json_decode(json_encode($SqlResult),TRUE);

    //用$SqlResultArray的'k'作为键,'v'作为值生成新的键值数组
    $Array=array_column($SqlResultArray,'v','k');

    //输出$Array
    print_r($Array);

    Array
    (
        [AppName] => 'V2EX'
        [AppSite] => 'http://www.v2ex.com/'
        [AppVersion] => 100
    )

    13 条回复    2016-07-22 09:27:50 +08:00
    imn1
        1
    imn1  
       2016-07-21 16:32:58 +08:00
    10+年没写 PHP 了,我记得有个函数可以用 array A 和 array B 各自的值配对成新数组的
    5dkgansm
        2
    5dkgansm  
       2016-07-21 16:35:06 +08:00   ❤️ 1
    $newarr = array_combine($arr1,explode(',','AppName,AppDescription,AppVersion'));
    qiayue
        3
    qiayue  
       2016-07-21 16:35:07 +08:00   ❤️ 1
    最简单最容易想的方法是循环一下,因为你这个场景数据长度不会太长,循环不会太耗时
    5dkgansm
        4
    5dkgansm  
       2016-07-21 16:36:17 +08:00
    参数写反了,很久没用,无视吧
    ragnaroks
        5
    ragnaroks  
    OP
       2016-07-21 16:36:37 +08:00
    @qiayue
    很不幸,我这个只是示例数据,原始数据是数据库内 N 行数据,但希望以某个字段名作为结果索引.
    5dkgansm
        6
    5dkgansm  
       2016-07-21 16:38:10 +08:00   ❤️ 2
    array_column 和 array_combine 组合用效果很好 @ragnaroks
    qiayue
        7
    qiayue  
       2016-07-21 16:38:17 +08:00
    function arr2map($arr){
    $m = array();
    foreach($arr as $o){
    $m[$o->k] = $o;
    }
    return $m;
    }
    qiayue
        8
    qiayue  
       2016-07-21 16:39:28 +08:00
    6 楼的方法好
    ragnaroks
        9
    ragnaroks  
    OP
       2016-07-21 16:49:44 +08:00
    @5dkgansm
    虽然很麻烦,但是精准解决问题了
    techmoe
        10
    techmoe  
       2016-07-21 17:54:29 +08:00 via Android
    别的都好说,没想通数组怎么转 stdClass Object
    难道说写个 class 然后拿构造函数绑属性上去吗。。
    jhdxr
        11
    jhdxr  
       2016-07-21 17:56:53 +08:00
    @techmoe json_decode(json_encode($arr))
    sarike
        12
    sarike  
       2016-07-21 18:05:38 +08:00
    @techmoe (object)$arr
    junyuecao
        13
    junyuecao  
       2016-07-22 09:27:50 +08:00 via Android
    我是来试一下头像的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1041 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 22:35 · PVG 06:35 · LAX 14:35 · JFK 17:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.