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

2014-01-20 17:22:22 +08:00
 66beta
$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'];

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

这样不行吗?
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
2014-01-21 12:05:52 +08:00
看到 @Sunyanzi 回复,我觉得可以这样,层级是固定的:
current(current(current( $sourceArray )));

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

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

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

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

想要代码智能一定是以牺牲性能为代价的 ... 具体如何选择还是看你自己了 ...
66beta
2014-01-22 11:38:28 +08:00
@Sunyanzi 多谢!
就current之后取键值,反正结构是定的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/97725

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX