我已经完成了最终目标,但也许有一种更优雅的方式来实现这一目标。
如果我有这样的数组:
$data = array(
'wood' => 2,
'metal' => 5,
'plastic' => 3,
);
我想从$ data获得前2个键/值对(即金属:5& plastic:3)。这就是我想出的:
arsort($data); //put values in order
reset($data); //set pointer to first element
$first = each($data); //assign first element to $first
array_shift($data); //remove first element from array
reset($data); //set pointer to the new first element
$second = each($data); //assign the new first element to $second
答案 0 :(得分:8)
为了获得关键和价值,我会这样:
arsort($data);
$result = array_slice($data,0,2);
答案 1 :(得分:2)
asort($data);
$first = array_pop($data);
$second = array_pop($data);
请注意,我没有将它按相反的顺序排列并抓住第一个项目,而是按顺序排列并抓住最后的项目。
答案 2 :(得分:1)
你的代码是正确的,你只需要一些额外的电话
arsort($data);
$first = each($data);
$second = each($data);
应该足够了。
你需要更具体地了解你想要得到什么。 each
返回四个元素的数组 - 这是你想要的吗?
答案 3 :(得分:0)
这样的事情:
$array = array (
'wood' => 2,
'metal' => 1,
'blah' => 4
);
$first = end($array);
$second = prev($array);
答案 4 :(得分:0)
可能不完全是Priority Queue的用途,而regular array sorting和extracting functions也完全正常,但要添加新内容:
$queue = new SplPriorityQueue;
$queue->setExtractFlags(SplPriorityQueue::EXTR_BOTH);
$queue->insert('wood', 2);
$queue->insert('metal', 5);
$queue->insert('plastic', 3);
这会自动按数值的降序排序。要获取元素,请执行
var_dump(
$queue->extract(),
$queue->extract()
);
会给(codepad)
array(2) { ["data"]=> string(5) "metal", ["priority"]=> int(5) }
array(2) { ["data"]=> string(7) "plastic", ["priority"]=> int(3) }
然后离开$queue
只包含'wood'。
除SplPriorityQueue
外,您还可以使用SplMaxHeap
。
阅读更多内容: