我有一个带有特定键的数组:
array(
420 => array(...),
430 => array(...),
555 => array(...)
)
在我的应用程序中,我知道当前密钥(例如555
)。我想获得前面的数组元素。在此示例中,它是具有键430
的数组元素。我怎么能用PHP做到这一点?我尝试使用prev()
,但是对于这个函数,我们应该知道当前的数组元素。我找不到函数,是什么设置当前数组元素。
答案 0 :(得分:30)
一个选项:
要set the internal pointer to a certain position,您必须转发它(使用key
和next
,也许之前执行reset
以确保从数组的开头开始) :
while(key($array) !== $key) next($array);
然后您可以使用prev()
:
$prev_val = prev($array);
// and to get the key
$prev_key = key($array);
根据之后您要对数组执行的操作,您可能需要reset
内部指针。
如果数组中不存在该键,则会出现无限循环,但这可以通过以下方式解决:
while(key($array) !== null && key($array) !== $key)
当然prev
不会再给你正确的价值了,但我认为你要搜索的密钥无论如何都会在数组中。
答案 1 :(得分:19)
快速查找解决方案:(如果必须多次执行此操作)
$keys = array_flip(array_keys($array));
$values = array_values($array);
return $values[$keys[555]-1];
array_flip
(
array_keys
($array));
会将数组映射键返回到原始数组中的位置,例如array(420 => 0, 430 => 1, 555 => 2)
。
并且array_values
()返回一个数组映射位置到值,例如array(0 => /* value of $array[420] */, ...)
。
因此,$values[$keys[555]-1]
有效地返回前面的元素,因为当前元素具有键555。
替代解决方案:
$keys = array_keys($array);
return $array[$keys[array_search(555, $keys)-1]];
答案 2 :(得分:6)
我用这种方式解决了这个问题:
function getPrevKey($key, $hash = array())
{
$keys = array_keys($hash);
$found_index = array_search($key, $keys);
if ($found_index === false || $found_index === 0)
return false;
return $keys[$found_index-1];
}
@return previous key或false如果没有以前的键可用
示例:
$myhash = array(
'foo' => 'foovalue',
'goo' => 'goovalue',
'moo' => 'moovalue',
'zoo' => 'zoovalue'
);
echo "TEST: ". getPrevKey('zoo', $myhash); // prints moo
答案 3 :(得分:2)
您可以反向迭代数组,并在找到搜索值后返回下一个迭代。
$found = false;
foreach(array_reverse($array, true) as $key=>$value) {
if ($found) {
print "$key => $value\n";
break;
} else if ($key == 555) {
$found = true;
}
}
答案 4 :(得分:2)
迭代数组
$_index = null;
foreach($myarray as $index => $value)
{
if($key == $my_index) // if($key == 550)
{
break;
}
$_index = $index;
}
echo $_index; //the prev key from 550;
另一种解决方案是将数组的键放在枚举数组中,如下所示:
$keys = array_keys($my_array);
由于keys数组是索引,你可以移动上一个键,如下所示:
$required_key = (array_search(550,$keys,true) - 1);
这将使550
的值更好,并在键内返回其索引,删除一个以获取先前的索引
键我们有以前的键来获取原始数组的值
$value = $my_array[$required_key];
答案 5 :(得分:2)
@Luca Borrione的解决方案很有帮助。 如果要查找上一个和下一个键,可以使用以下功能:
function getAdjascentKey( $key, $hash = array(), $increment ) {
$keys = array_keys( $hash );
$found_index = array_search( $key, $keys );
if ( $found_index === false ) {
return false;
}
$newindex = $found_index+$increment;
// returns false if no result found
return ($newindex > 0 && $newindex < sizeof($hash)) ? $keys[$newindex] : false;
}
用法:
// previous key
getAdjascentKey( $key, $hash, -1 );
// next key
getAdjascentKey( $key, $hash, +1 );
示例:
$myhash = array(
'foo' => 'foovalue',
'goo' => 'goovalue',
'moo' => 'moovalue',
'zoo' => 'zoovalue'
);
getAdjascentKey( 'goo', $myhash, +1 );
// moo
getAdjascentKey( 'zoo', $myhash, +1 );
// false
getAdjascentKey( 'foo', $myhash, -1 );
// false
答案 6 :(得分:0)
这是一个简单的解决方案,用于获取前一个和下一个项目,即使我们位于数组的末尾。
<?php
$current_key; // the key of the item we want to search from
if (isset($array[$current_key+1]))
{
// get the next item if there is
$array_next = $array[$current_key+1];
}
else
{
// if not take the first (this means this is the end of the array)
$array_next = $array[0];
}
if (isset($array[$current_key-1]))
{
// get the previous item if there is
$array_prev = $array[$current_key-1];
}
else
{
// if not take the last item (this means this is the beginning of the array)
$array_prev = $array[count($array)-1];
}
答案 7 :(得分:0)
进一步扩展Luca Borrione和cenk的解决方案,以便您可以在任一方向环绕阵列的末端,您可以使用:
function getAdjascentKey($key, $hash = array(), $increment) {
$keys = array_keys($hash);
$found_index = array_search($key, $keys);
if ($found_index === min(array_keys($keys)) && $increment === -1) {
$found_index = max(array_keys($keys))+1;
}
if ($found_index === max(array_keys($keys)) && $increment === +1) {
$found_index = min(array_keys($keys))-1;
}
return $keys[$found_index+$increment];
}
答案 8 :(得分:0)
如果数据很大,那么最好避免循环。您可以创建自己的自定义函数,如下所示:
$array = array('first'=>'111', 'second'=>'222', 'third'=>'333');
function previous($key, $array) {
$keysArray = array_keys($array);
$keyNumber = array_search($key, $keysArray);
if ($keyNumber === 0) {
$keyNumber = count($array);
}
return $array[$keysArray[$keyNumber - 1]];
}
var_dump(previous("second", $array));
请注意,如果您提供第一个键,则它将返回最后一个值,例如循环数组。您可以随心所欲地处理它。
稍作调整,您也可以将其概括为返回下一个值。
关于prev
不起作用的原因是因为它不用于此目的。它只是将数组的内部指针设置为next
我希望对您有帮助