如果快速获取层层array包围的值?请进来看代码~ - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
66beta
V2EX    PHP

如果快速获取层层array包围的值?请进来看代码~

  •  
  •   66beta 2014-01-20 17:22:22 +08:00 4129 次点击
    这是一个创建于 4287 天前的主题,其中的信息可能已经有所发展或是发生改变。
    $sourceArray = array(2) {
    ["8e02bf00-901b-4168-b2ca-a7b368113d84"]=>// [ [ [这个键值是不知道的] ] ]
    array(1) {
    [0]=>
    array(1) {
    ["value"]=>
    string(10) "2014-03-29"
    }
    }
    ["b2e556f2-09e5-4f32-bef8-d51d52779e0f"]=>
    array(1) {
    [0]=>
    array(1) {
    ["value"]=>
    string(5) "18:30"
    }
    }
    }

    如上Joomla的数据,比如我要取得"2014-03-29"?

    目前根据网上搜来的是用array_values:
    $srcArray= array_values($sourceArray);
    $eventDate = $srcArray[0][0]['value'];

    这样总觉得有些浪费性能,毕竟多生成了一个没用的数组,我只是想先获得“日期”来判断下,如果“日期”没有过期,那么数组中其他的数据我还是要显示的~
    8 条回复    1970-01-01 08:00:00 +08:00
    9
        1
    9  
       2014-01-20 17:59:53 +08:00
    这数组真蛋疼,试了下没找到好的方法,array_pop 不错可是会破坏数组,等高人。
    judasnow
        2
    judasnow  
       2014-01-20 18:51:39 +08:00
    array_filter($sourceArray, function($item) {
    return $item['value'] > 'whatEverTime';
    });

    这样不行吗?
    Sunyanzi
        3
    Sunyanzi  
       2014-01-20 20:05:27 +08:00
    如果难点只在如何定位未知 key 的话 ... 下面这种方法可以帮你 ...

    $value = current( $sourceArray )[0][0]; // 2014-03-29

    php 5.4+ 适用 ...

    如果要进行更复杂的操作 ... array_walk_recursive 这类直接忽视层级的函数也许有用 ...
    66beta
        4
    66beta  
    OP
       2014-01-21 12:05:52 +08:00
    看到 @Sunyanzi 回复,我觉得可以这样,层级是固定的:
    current(current(current( $sourceArray )));

    这样只处理了一条数据,数据多了循环下来,不知道current的性能如何?
    话说joomla的插件都是用大串XML/json存数据库的,太蛋疼了
    dulao5
        5
    dulao5  
       2014-01-21 14:41:53 +08:00   1
    看起来你追求的是性能快速。
    我追求的是优雅,开发过简单的xpath语法来选择复杂数组里的元素。

    我的代码没法开源,搜了一下,有类似实现: https://code.google.com/p/jsonpath/wiki/PHP
    66beta
        6
    66beta  
    OP
       2014-01-21 14:44:25 +08:00
    @dulao5 大哥,你想多了,我还只是个框架小子
    我只是想用最简单、便捷、省资源的办法,完成一个小小的需求~
    Sunyanzi
        7
    Sunyanzi  
       2014-01-21 21:02:23 +08:00
    @66beta current 的性能还不错 ... 至少优于单次 foreach 然后 break ...

    至于如果用三次 current ... 性能肯定低于一次 current 之后用键值命中 ...

    毕竟多了两次函数调用 ... 我个人还是倾向于写死理论上确定的键值 ...

    想要代码智能一定是以牺牲性能为代价的 ... 具体如何选择还是看你自己了 ...
    66beta
        8
    66beta  
    OP
       2014-01-22 11:38:28 +08:00
    @Sunyanzi 多谢!
    就current之后取键值,反正结构是定的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2974 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 13:01 PVG 21:01 LAX 06:01 JFK 09:01
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86