将具有特定值的数组元素放入数组的末尾

时间:2014-07-24 09:47:42

标签: php arrays

我有一个像这样的多维数组:

$array = array(
    1 => array(
         "name" => 'Jon',
         "year" => '2012'
    ),
    2 => array(
         "name" => 'Jack',
         "year" => '1900'
    ),
    3 => array(
         "name" => 'Lisa',
         "year" => '1900'
    ),
    4 => array(
         "name" => 'Ygritte',
         "year" => '1929'
    ),
);

所有年份为' 1900'应该放在数组的末尾。什么是轻量级解决方案?

期望的结果:

$array = array(
    1 => array(
         "name" => 'Jon',
         "year" => '2012'
    ),
    2 => array(
         "name" => 'Ygritte',
         "year" => '1929'
    ),
    3 => array(
         "name" => 'Jack',
         "year" => '1900'
    ),
    4 => array(
         "name" => 'Lisa',
         "year" => '1900'
    ),
);

4 个答案:

答案 0 :(得分:1)

我认为您不关心索引,因为您重新排列它们。首先,你应该从0开始数组中的索引,而不是1。

您可以使用以下代码:

$array = array(
    1 => array(
         "name" => 'Jon',
         "year" => '2012'
    ),
    2 => array(
         "name" => 'Jack',
         "year" => '1900'
    ),
    3 => array(
         "name" => 'Lisa',
         "year" => '1900'
    ),
    4 => array(
         "name" => 'Ygritte',
         "year" => '1929'
    ),
);


$array = array_values($array);


for ($i=0, $c = count($array); $i<$c; ++$i) {
    if ($array[$i]['year'] == '1900') {
        $array[] = $array[$i];
        unset($array[$i]);
    }

}

$array = array_values($array);



foreach ($array as $k => $v) {
    echo $k.' '.$v['name'].' '.$v['year']."<br />";

}

结果是:

0 Jon 2012
1 Ygritte 1929
2 Jack 1900
3 Lisa 1900

当然,如果你愿意,你可以改变你的键,每个键加1(从最后一个元素开始),所以你有相同的输出,但我认为这个对你来说已经足够了。

答案 1 :(得分:0)

最简单的方法可能是这样的: 找到具有1900年(迭代循环)的元素,然后

例如为索引3工作

$tmp = $myArray['3'];
unset($myArray['3'];
$myArray['3'] = $tmp;
  

$ tmp是循环内的临时变量。

答案 2 :(得分:0)

希望以下代码能为您提供帮助:

function aasort (&$array, $key) {
$sorter=array();
$ret=array();
reset($array);
foreach ($array as $ii => $va) {
    $sorter[$ii]=$va[$key];
}
rsort($sorter);
foreach ($sorter as $ii => $va) {
    $ret[$ii]=$array[$ii];
}
$array=$ret;
}

aasort($array,"year");
print_r($array);

答案 3 :(得分:0)

尝试使用SplHeap

class MyQueue extends SplHeap
{
    public function compare($item1, $item2)
    {
        if ($item1['year'] === $item2['year']) return 0;
        return ($item1['year'] == 1900) ? -1 : 0;
    }
}

$queue = new MyQueue();
foreach ($array as $item) {
    $queue->insert($item);
}

$queue->top();
$array = array();
while($queue->valid()){
    $array[] = $queue->current();
    $queue->next();
}

print_r($array);