PHP获取前一个数组元素知道当前数组键

时间:2011-01-25 11:01:54

标签: php arrays

我有一个带有特定键的数组:

array(
    420 => array(...), 
    430 => array(...), 
    555 => array(...)
)

在我的应用程序中,我知道当前密钥(例如555)。我想获得前面的数组元素。在此示例中,它是具有键430的数组元素。我怎么能用PHP做到这一点?我尝试使用prev(),但是对于这个函数,我们应该知道当前的数组元素。我找不到函数,是什么设置当前数组元素。

9 个答案:

答案 0 :(得分:30)

一个选项:

set the internal pointer to a certain position,您必须转发它(使用keynext,也许之前执行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;
  }
}

http://ideone.com/2WqmC

答案 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

的倒数第二个

我希望对您有帮助