PHP中如何获得数组中指定元素的前一个或后一个元素

方法一:用循环

function getNext(&$array, $curr_key)
{
    $next = 0;
    reset($array);

    do
    {
        $tmp_key = key($array);
        $res = next($array);
    } while ( ($tmp_key != $curr_key) && $res );

    if( $res )
    {
        $next = key($array);
    }

    return $next;
}

function getPrev(&$array, $curr_key)
{
    end($array);
    $prev = key($array);

    do
    {
        $tmp_key = key($array);
        $res = prev($array);
    } while ( ($tmp_key != $curr_key) && $res );

    if( $res )
    {
        $prev = key($array);
    }

    return $prev;
}

方法二:用Iterator,不过要先得到position

// 默认查找键为key元素的后一个元素
function get_element($key, $arr, $who='next')
{
    //查找键为$key元素的位置
    $offset = array_search($key, array_keys($arr));
    if(FALSE == $offset || NULL == $offset) { return ;}

    //查找哪个元素,前一个或后一个?
    if ('prev' == $who) {
        $arr = array_reverse($arr);
    } else if ('next' == $who) {

    } else {
        throw new Exception("错误的参数");
    }

    $iterator = new ArrayIterator($arr);
    $iterator->seek($offset);
    $iterator->next();

    //返回数组当前指针指向元素的键值数组
    return array($iterator->key(), $iterator->current());
}

$arr = array('foo' => 10, 'bar' => 45, 'baz' => 23);
$key ='bar';

print_r(get_element($key, $arr));

方法三:老风给的方法

我按照老风的意思写的:

function get_element($key, $array, $who='next') {
	//先获取key 的位置
	$arr_keys = array_keys($array);
    $arr_keys_flip = array_flip($arr_keys);

    if (array_key_exists($key, $arr_keys_flip)) {
        $location = $arr_keys_flip[$key];//返回KEY的位置
    } else {
        throw new Exception("数组中不存在此键");
    }

	$arr_values = array_values($array);

    //查找哪个元素,前一个或后一个?
    if ('prev' == $who) {
        $pos = $location-1;
    } else if ('next' == $who) {
        $pos = $location+1;
    } else {
        throw new Exception("错误的参数");
    }

	return array($arr_keys[$pos], $arr_values[$pos]);
}

老风觉得太长,又优化了一遍

function get_element($key, $array, $who='next'){
	$arr_keys = array_keys($array);
	$arr_keys_flip = array_flip($arr_keys);
	$location = (array_key_exists($key,$arr_keys_flip))?$arr_keys_flip[$key]:die('数组中不存在此键');
	$arr_values = array_values($array);
	$info = array('prev'=>$location-1,'next'=>$location+1);
	$pos = (array_key_exists($who,$info))?$info[$who]:die('错误的参数');
	return array($arr_keys[$pos], $arr_values[$pos]);
}

经过效率测试,方法二的效率最高,不过仍然存在瓶颈,那就是array_keys函数,因此如果此处使用foreach取得location将会大大提高效率:

function get_element($key, $arr, $who='next')
{
    //查找键为$key元素的位置
    $offset = 0;
    foreach ($arr as $_k => $_v) {
        if($_k == $key) break;++$offset;
    }

    //查找哪个元素,前一个或后一个?
    if ('prev' == $who) {
        $arr = array_reverse($arr);
    } else if ('next' == $who) {

    } else {
        throw new Exception("错误的参数");
    }

    $iterator = new ArrayIterator($arr);
    $iterator->seek($offset);
    $iterator->next();

    //返回数组当前指针指向元素的键值数组
    return array($iterator->key(), $iterator->current());
}

C语言中数组变量及用法

在C语言中,数组是一类复杂数据类型,数组元素可以是任意数据类型,但所有元素类型必须一致。C语言中的数组值得注意的地方有以下两点:

  • C语言中只有一维数组,而且数组的大小必须在编译期就作为一个常数确定下来。然而,C语言中数组的元素可以是任何类型的对象,当然也可以是另外一个数组。这样“仿真”出一个多维数组就不是一件难事。
  • 对于一个数组,我们只能够做两件事情:确定该数组的大小,以及获得指向该数组下标为0的元素的指针。其他有关数组的操作,哪怕它们乍看上去是以数组下标进行运算的,实际上都是通过指针进行的。换句话说,任何一个数组下标运算都等同于一个对应的指针运算,因此我们完全可以依据指针行为定义数组下标的行为。

要理解C语言数组的运作机制,我们首先来声明并定义一个数组。例如

int a[3] = {3, 7, 9};

除了a被用作运算符sizeof的参数这一情形,在其他所有情形中数组名a都代表指向数组a中下标为0的元素的指针。正如我们合乎情理的期待,sizeof a的结果是整个数组a的大小,而不是指向数组a的元素的指针的大小。

从上面的理论我们不难看出,*a即数组中下标为0的元素的引用。例如,我们可以这样写:

*a = 84;

这个语句将数组a中下标为0的值设置为84。同样道理,*(a+1)是数组a中下标为1的元素的引用,依次类推。概而言之,*(a+i)即数组a中下标为i的元素的引用;这种写法是如此常用,因此它被简记为a[i]。

实际上,由于a+i与i+a含义一样,因此a[i]与i[a]也具有同样的含义。

给定一个数组,求任意(N-1)个元素的乘积中的最大值?

题目——子数组的最大乘积?
给定一个长度为N的整数数组(数组元素可以为正或负或0),计算任意(N-1)个元素的乘积中的最大值。

#include 
#define N 8
int recur_multi(int a[], int len);
int main(int argc, char *argv[])
{
    int a[N] = {5, -2, -3, -5, 3, 2, 1, 4};
    int b[N] = {0};
    int i;
    int tmp;
    int max;
    for (i = 0; i < N; ++i)
    {
        tmp = a[i];
        a[i] = 1;
        b[i] = recur_multi(a, N-1);
        a[i] = tmp;
    }
    for (i = 0; i < N; ++i)
    {
        printf("%d\t", b[i]);
    }
    max = b[0];
    for (i = 1; i < N; ++i)
    {
        if (b[i] > max)
        {
            max = b[i];
        }
    }
    printf ("\n%d\n",max);
    return 0;
}
int recur_multi(int a[], int len)
{
    if (0 == len)
    {
        return a[0];
    } else {
        return a[len] * recur_multi(a, len-1);
    }
}