Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获取前N个元素,但如果N+;1等于N,返回N+;1也是_Php_Arrays - Fatal编程技术网

Php 获取前N个元素,但如果N+;1等于N,返回N+;1也是

Php 获取前N个元素,但如果N+;1等于N,返回N+;1也是,php,arrays,Php,Arrays,我有如下关联数组: array( [random_key_1] => 30, [random_key_2] => 27, [random_key_3] => 25, [random_key_4] => 25, [random_key_5] => 25, [random_key_6] => 22, ); 数组已经排序了,我不知道键名。我想得到前3个元素。但很简单: array_slice($array, 0, 3

我有如下关联数组:

array(
    [random_key_1] => 30,
    [random_key_2] => 27,
    [random_key_3] => 25,
    [random_key_4] => 25,
    [random_key_5] => 25,
    [random_key_6] => 22,
);
数组已经排序了,我不知道键名。我想得到前3个元素。但很简单:

array_slice($array, 0, 3);
在我的例子中不起作用,因为第四个和第五个元素也应该返回


是否有任何内置函数,或者我应该从头开始编写?我认为这应该是一个递归函数来检查连续的元素。

最好的办法是抓住前三个元素,然后迭代其余元素,检查下一个元素是否等于最后一个元素。如果是,抓住它,否则停止迭代

像这样的方法应该会奏效:

$top = array_slice($array, 0, 3);
foreach( array_slice( $array, 4) as $el) {
    if( $el === $top[2]) {
        $top[] = $el;
    } else {
        break;
    }
}

注意:您也可以使用数组指针和
reset()
current()
next()
来获取前3个元素,然后继续迭代,直到当前元素不等于最后一个元素。

您最好的选择是获取前三个元素,然后迭代其余元素,检查下一个元素是否等于最后一个元素。如果是,抓住它,否则停止迭代

像这样的方法应该会奏效:

$top = array_slice($array, 0, 3);
foreach( array_slice( $array, 4) as $el) {
    if( $el === $top[2]) {
        $top[] = $el;
    } else {
        break;
    }
}

注意:您也可以使用带有
reset()
current()
next()
的数组指针来获取前3个元素,然后继续迭代,直到当前元素不等于最后一个元素。

也许这就是您想要做的。 获取顶部元素的值,然后将它们与数组相交以保留关键帧

// gets the unique top 3 values
$top_values = array_slice(array_unique($array), 0, 3);
// intersects the original array with the top 3 values
$top_values_with_keys_and_duplicates = array_intersect($array, $top_values);

也许这就是你想要做的。 获取顶部元素的值,然后将它们与数组相交以保留关键帧

// gets the unique top 3 values
$top_values = array_slice(array_unique($array), 0, 3);
// intersects the original array with the top 3 values
$top_values_with_keys_and_duplicates = array_intersect($array, $top_values);

递归用于嵌套元素。您有一个平面结构,它更适合于迭代。递归适用于嵌套元素。您有一个更适合迭代的平面结构。如果应该保留密钥,您可以使用
foreach(array\u-slice($array,4)as$key=>$el)
$top[$key]=$el
@MartyMcVry-True,但是对于
array\u-slice()
的两个调用,您都需要将
$preserve\u-keys
参数设置为
True
,否则,在编写时,它将始终从
0
开始以数字形式重新索引数组。也许这不是他想要的。如果数组类似于
数组(1,2,2,3,4)
$top
则等于
(12)
,而它应该是
(1,2,3)
是的,我想保留键。如果应该保留键,则可以使用
foreach(array\u slice($array,4)as$key=>$el)
$top[$key]=$el
$MartyMcVry-True,但是您需要将
$preserve\u keys
参数设置为
true
,以便对
array\u slice()
进行两次调用,否则在编写时,它将始终从
0
开始以数字形式重新索引数组。也许这不是他想要的。如果数组类似于
数组(1,2,2,3,4)
$top
则等于
(12)
,而它应该是
(1,2,3)
是的,我想保留键。哇,你的解决方案更好,让我接受你的答案。很有魅力,谢谢!哇,你的答案更好,让我接受你的答案吧。很有魅力,谢谢!