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)
是的,我想保留键。哇,你的解决方案更好,让我接受你的答案。很有魅力,谢谢!哇,你的答案更好,让我接受你的答案吧。很有魅力,谢谢!