您好,欢迎访问一九零五行业门户网

php中如何找出一个哈希数组中的某个元素的前后项

这个标题看起来比较绕口,我直接上代码吧,比如有下面这样一种形式组织的数组
$a = array( 'key12' => 12323, 'key32' => 4345, 'key13' => 323423, 'key43' => 32423, 'key25' => 33423);

对于一个未知的数组,我知道了其中任意一个已经存在的元素的键值,比如就是key13吧,那我如何知道key13的前后分别是哪两个键呢?比如在这个例子中,我如何才能知道$a和key13,找出key32和key43呢?
这种哈希数组没有顺序的数值键值,因此不能对键值+1或者-1,来获取前驱和后继,不知道各位有什么好办法?
回复内容: 这个标题看起来比较绕口,我直接上代码吧,比如有下面这样一种形式组织的数组
$a = array( 'key12' => 12323, 'key32' => 4345, 'key13' => 323423, 'key43' => 32423, 'key25' => 33423);

对于一个未知的数组,我知道了其中任意一个已经存在的元素的键值,比如就是key13吧,那我如何知道key13的前后分别是哪两个键呢?比如在这个例子中,我如何才能知道$a和key13,找出key32和key43呢?
这种哈希数组没有顺序的数值键值,因此不能对键值+1或者-1,来获取前驱和后继,不知道各位有什么好办法?
可以参考下php - search array keys and return the index of matched key - stack overflow,思路是找出key所在的索引,然后根据索引再减1或加1取得前后项:http://stackoverflow.com/questions/37...
我写了段测试代码:
12323, 'key32' => 4345, 'key13' => 323423, 'key43' => 32423, 'key25' => 33423);print_r($a);echo
;$key = 'key13';// 寻找key的索引号$keys = array_keys($a);$key_index = array_search($key, $keys);echo index of $key is $key_index
;// 将key索引号减1或加1取得前项和后项索引(注意要判断是否越界)if ($key_index == 0) echo 'no pre key
';else echo 'pre key is ' . $keys[$key_index - 1] . '
';if ($key_index ';else echo 'no next key
';?>
null的说的对(已经点了赞了),在php function层面(zend api层面我不知道),没有办法绕过数组遍历,代码大概像这样(随手写的伪代码,不能执行的,下同):
4345, 'key13' => 323423, 'key43' => 32423, 'key25' => 33423);while(key($a) !== 'key13') next($a);$prev_val = prev($array);# 前一项的value$prev_key = key($array);# 前一项的key
获取后一项用 next 函数, 方法类似.
参考: http://stackoverflow.com/questions/47...
遍历数组再通过prev/next这些函数操作, 或者提取keys组成新数组,然后通过value(原先的key值)取数字下标,再对应key
大体除了这些好像没太好的办法
楼上提到的方法都需要把整个数组过一遍,效率比较低,限于语言层面的原因,只使用php语言本身也只能达到这个程度。
但是正如 @liruqi 同学的答案,php实际上是使用了hash+双向链表的方式来实现的,所以如果给php写一个c扩展的话,可以用o(1)的时间来获得你要的答案。
其它类似信息

推荐信息