2012-07-27 875 views
8

是否可以限制数组中的成员数量,例如MySQL中的LIMIT?例如,如果我有$arrayx成员,并且我只想返回其中的前50个,那么我该怎么做?在PHP中限制数组长度PHP

我是否应该使用count()array_slice()的组合,还是有更简单的方法?

+0

我假定你的意思array_slice(),而不是array_splice();和count()应该不是必需的 – 2012-07-27 14:51:24

+0

谢谢 - 更正'array_slice()'。 – Alfo 2012-07-27 15:06:21

回答

22

使用array_slice应该这样做。

array_slice($array, 0, 50); // same as offset 0 limit 50 in sql 
+0

是的,不要使用拼接,因为这会修改你的输入数组。 – 2012-07-27 14:51:39

+0

谢谢 - 我错过了最后一个参数的文档,并假定我必须用'count()'做一些奇怪的事情,然后在'array_slice()'中使用它作为参数。 – Alfo 2012-07-27 14:53:59

0

确保$array只有50长:

array_splice($array, 50); 

还是回到最初的50:

$new_array = array_slice($array, 0, 50); 

如何容易,你希望它是什么? ;)

0

对于数组本身,无法限制其中元素的数量。

你可以实现自己的方法获得一个数组的前50个元素(甚至在某个偏移量后的前50个元素)(我推荐使用循环,因为使用关联数组,array_splice()将不起作用):

function limit($array, $limit, $offset = 0) { 
    $return = array(); 
    $end = ($limit + $offset); 
    $count = 0; 
    foreach ($array as $key => $val) { 
     if ($count++ > $offset) { 
      $return[$key] = $val; 
     } 
     if ($count == $end) break; 
    } 
    return $return; 
} 

EDIT:该函数提供了相同的结果用array_slice($array, $offset, $limit, true);;第四个参数保留关联数组中的键。

+0

'array_slice'对于关联数组有一个'$ preserve_keys = false'第四个参数。 – complex857 2012-07-27 14:55:36

+0

@ complex857良好的捕获;我只是查了一下方法并确认了(并且已经更新了我的答案以匹配)。谢谢=] – newfurniturey 2012-07-27 14:59:35

4

随着SPL(更好的内存占用):

// Using fixed array 
$fixedArray = SplFixedArray::fromArray($array); 
$fixedArray->setSize(min(50, count($array)); 

// Using iterator 
$limitIterator = new LimitIterator(new ArrayIterator($array), 0, 50); 
+0

新增迭代技巧。 – Florent 2012-07-27 14:59:48

+1

+1我喜欢LimitIterator,尽管我不称它为诡计。也许一个不太受欢迎的功能;) – nickb 2012-07-27 15:02:21

+0

@nickb它当然没有任何窍门。我建议大家掌握无数的数组函数*和*各种可用的迭代器类。 – salathe 2012-07-30 21:41:45