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

PHP 数组问题

  •  1
     
  •   ironman55 · 2019-04-26 15:51:15 +08:00 · 3911 次点击
    这是一个创建于 1798 天前的主题,其中的信息可能已经有所发展或是发生改变。

    $a = ['Date','Media','Geo']; $b = ['Num'];

    $subject = ['Date'=>'2019-04-26','Media'=>'AAA','Geo'=>'CN','Num'=>105]; 求一个函数,处理完, 返回结果为 $res['2019-04-26']['AAA']['CN']['Num'] = 105;

    $a 和$b 属于可以随意配置的数组,这两个数组的值,一定在 subject 中存在 key;

    24 条回复    2019-05-09 15:32:28 +08:00
    ironman55
        1
    ironman55  
    OP
       2019-04-26 15:52:26 +08:00
    来人救命呀
    oovveeaarr
        2
    oovveeaarr  
       2019-04-26 15:57:49 +08:00
    用循环好像可以直接做到?
    slgz
        3
    slgz  
       2019-04-26 15:59:06 +08:00
    意思是根据$a 的 key , 在 $subJect 中取值,?
    ShundL
        4
    ShundL  
       2019-04-26 15:59:25 +08:00
    直接遍历$a 和$b, 从$subject 取值,生成$res
    ironman55
        5
    ironman55  
    OP
       2019-04-26 15:59:43 +08:00
    @oovveeaarr 怎么做到
    ironman55
        6
    ironman55  
    OP
       2019-04-26 16:00:17 +08:00
    @slgz $a 其实相当于一个 group by,因为实际代码中还要在累加
    ironman55
        7
    ironman55  
    OP
       2019-04-26 16:00:40 +08:00
    @ShundL 但是怎么生成多维数组呢
    qcgzxw
        8
    qcgzxw  
       2019-04-26 16:09:42 +08:00
    php > $res[$subject[$a[0]]][$subject[$a[1]]][$subject[$a[2]]][$b[0]] = $subject[$b[0]];
    php > print_r($res);

    Array
    (
    [2019-04-26] => Array
    (
    [AAA] => Array
    (
    [CN] => Array
    (
    [Num] => 105
    )
    )
    )
    )
    ironman55
        9
    ironman55  
    OP
       2019-04-26 16:12:21 +08:00
    @qcgzxw 需要的是一个通用的函数,能巧妙处理这个问题的,因为$a 和$b 的数量是可变的
    qcgzxw
        10
    qcgzxw  
       2019-04-26 16:14:43 +08:00
    看不出来这是遍历吗
    shiny
        11
    shiny  
       2019-04-26 16:17:27 +08:00   ❤️ 2
    ironman55
        12
    ironman55  
    OP
       2019-04-26 16:19:52 +08:00
    @qcgzxw 是$a 和$b 的数量和内容是可变的,比如
    $a = ['Date'],
    $b = ['Income'],
    $subject = ['Date'=>'2019-04-26','Media'=>'AAA','Geo'=>'CN','Num'=>105,'Income'=>111];
    求出$res['2019-04-26']['Income'] = 111;
    需要的是通用型,能根据问题改变,而自动产生需要的结果;
    ironman55
        13
    ironman55  
    OP
       2019-04-26 16:29:36 +08:00
    @shiny 我试了下你的代码 差不多了 我还要再微调一下 十分感谢了!!!! 我比较好奇你的思路是怎么想的
    我的最终结果:
    array(1) {
    ["2019-04-19"]=>
    array(1) {
    ["applovin_int"]=>
    array(1) {
    ["AE"]=>
    &array(1) {
    ["Installs"]=>
    NULL
    }
    }
    }
    }
    shiny
        14
    shiny  
       2019-04-26 16:38:43 +08:00   ❤️ 1
    @ironman55 刚才第一遍实现没注意,取了 key,后来又改用 value 当 key,不知道是不是符合你要求。
    这个问题我在七年前设计自己的 PHP 模板引擎时候遇到过,当时也苦恼很久,多翻手册,后来就实现了。
    justin2018
        15
    justin2018  
       2019-04-26 16:45:53 +08:00
    @shiny 学习了~ 老铁 666
    jswh
        16
    jswh  
       2019-04-26 16:50:31 +08:00
    jswh
        17
    jswh  
       2019-04-26 16:50:42 +08:00   ❤️ 1
    <?php

    function solution($a, $b, $subject) {
    $keys = array_merge($a, $b);
    $values = [];
    foreach($keys as $key) {
    $values[] = $subject[$key];
    }
    return array_seq($values);
    }
    function array_seq($arr) {
    $count = count($arr);

    if ($count < 2) {
    throw new \Exception('error count');
    } elseif ($count == 2) {
    return [$arr[0] => $arr[1]];
    } else {
    $key = $arr[0];
    array_shift($arr);

    return [$key => array_seq($arr)];
    }

    }
    $a = ['Date','Media','Geo']; $b = ['Num'];

    $subject = ['Date'=>'2019-04-26','Media'=>'AAA','Geo'=>'CN','Num'=>105];
    var_dump(solution($a, $b, $subject));
    ironman55
        18
    ironman55  
    OP
       2019-04-26 18:23:20 +08:00
    @jswh 你的方法我看了下,虽然结果不是完全契合我的需要,但是只要微调就可以做到了,也非常非常非常感谢了!这种迭代的思路虽然看起来相对上面那个方法平民了一点,但是真的很巧妙了~再次非常感谢~谢谢啦
    alex321
        19
    alex321  
       2019-04-26 19:02:24 +08:00
    <?php
    $a = ['Date','Media','Geo'];
    $b = ['Num'];
    $subject = ['Date'=>'2019-04-26','Media'=>'AAA','Geo'=>'CN','Num'=>105];

    $indexs = array_reverse(array_merge($a, $b));

    $result = [];
    $last_key = '';

    $i = 0;
    foreach($indexs as $index) {
    $_key = $subject[$index];
    if ($i == 0) {
    $result = [$index => $_key];
    $last_key = $index;
    } else {
    $result[$_key] = $result;

    if (isset($result[$last_key])) {
    unset($result[$last_key]);
    }

    $last_key = $_key;
    }
    $i++;
    }

    #print_r(var_export($result, true));
    print_r($result['2019-04-26']['AAA']['CN']['Num']);
    alex321
        20
    alex321  
       2019-04-26 19:34:01 +08:00
    @alex321 #19 如果要直出最终的那个值,用 array_value 和 is_array 递归一下。
    Takamine
        21
    Takamine  
       2019-04-27 11:40:47 +08:00
    Takamine
        22
    Takamine  
       2019-04-27 12:30:48 +08:00
    emmm......感觉好像写麻烦了,对数组 a 的递归还可以再优化一下。
    Takamine
        23
    Takamine  
       2019-04-27 12:37:06 +08:00
    以$a 中的元素去寻找的键值,可以不用人为构造数组移去$subject 内的元素。
    $subject = array_diff($subject,[$point=>1]);这个操作可以不要。
    jswh
        24
    jswh  
       2019-05-09 15:32:28 +08:00
    @ironman55 客气。这种数据处理的过程一样,但是需要处理的数据是基于之前处理的过的问题,基本上就往递归方向想就行了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1022 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 19:23 · PVG 03:23 · LAX 12:23 · JFK 15:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.