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

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

  •  
  •   66beta · 2014-01-20 17:22:22 +08:00 · 3713 次点击
    这是一个创建于 3965 天前的主题,其中的信息可能已经有所发展或是发生改变。
    $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   ·   实用小工具   ·   3130 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:56 · PVG 21:56 · LAX 05:56 · JFK 08:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.