按日期重新排序数组,保留PHP中的索引

时间:2016-07-12 08:58:05

标签: php arrays

拥有以下数组:

array(2) {
  [1]=>   // <--------------- NOTICE THIS INDEX
  array(4) {
    [0]=>
    array(2) {
      [0]=>
      string(4) "2012"
      [1]=>
      float(1)
    }
    [1]=>
    array(2) {
      [0]=>
      string(4) "2013"
      [1]=>
      float(1)
    }
    [2]=>
    array(2) {
      [0]=>
      string(4) "2014"
      [1]=>
      float(2)
    }
    [3]=>
    array(2) {
      [0]=>
      string(4) "2015"
      [1]=>
      float(1)
    }
  }
  [2]=>  // <--------------- NOTICE THIS INDEX
  &array(7) {
    [0]=>
    array(2) {
      [0]=>
      string(4) "2009"
      [1]=>
      float(7)
    }
    [1]=>
    array(2) {
      [0]=>
      string(4) "2010"
      [1]=>
      float(2)
    }
    [2]=>
    array(2) {
      [0]=>
      string(4) "2011"
      [1]=>
      float(2)
    }
    [3]=>
    array(2) {
      [0]=>
      string(4) "2012"
      [1]=>
      float(0)
    }
    [4]=>
    array(2) {
      [0]=>
      string(4) "2013"
      [1]=>
      float(19)
    }
    [5]=>
    array(2) {
      [0]=>
      string(4) "2014"
      [1]=>
      float(8)
    }
    [6]=>
    array(2) {
      [0]=>
      string(4) "2015"
      [1]=>
      float(8)
    }
  }
}

我想先用最早的年份对数组进行重新排序,这意味着在上面的示例中,索引为2的数组具有2009,并且数组的最旧年份具有索引{{ 1}}是1,必须改变位置。我想要的输出应该是:

2012

这里的问题是我使用以下函数按日期重新排序(数组为array(2) { [2]=> &array(7) { [0]=> array(2) { [0]=> string(4) "2009" [1]=> float(7) } [1]=> array(2) { [0]=> string(4) "2010" [1]=> float(2) } [2]=> array(2) { [0]=> string(4) "2011" [1]=> float(2) } [3]=> array(2) { [0]=> string(4) "2012" [1]=> float(0) } [4]=> array(2) { [0]=> string(4) "2013" [1]=> float(19) } [5]=> array(2) { [0]=> string(4) "2014" [1]=> float(8) } [6]=> array(2) { [0]=> string(4) "2015" [1]=> float(8) } } [1]=> array(4) { [0]=> array(2) { [0]=> string(4) "2012" [1]=> float(1) } [1]=> array(2) { [0]=> string(4) "2013" [1]=> float(1) } [2]=> array(2) { [0]=> string(4) "2014" [1]=> float(2) } [3]=> array(2) { [0]=> string(4) "2015" [1]=> float(1) } } } ):

arraySeries

它工作正常,但索引已更改

$years = array();
foreach ($arraySeries as $key => $row)
{
    $years[$key] = $row[0];
}
array_multisort($years, SORT_ASC, $arraySeries);

如何在不使用array(2) { [0]=> // <-------- HERE IS A 0 WHEN IT SHOULD BE 2 &array(7) { [0]=> array(2) { [0]=> string(4) "2009" [1]=> float(7) } [1]=> array(2) { [0]=> string(4) "2010" [1]=> float(2) } [2]=> array(2) { [0]=> string(4) "2011" [1]=> float(2) } [3]=> array(2) { [0]=> string(4) "2012" [1]=> float(0) } [4]=> array(2) { [0]=> string(4) "2013" [1]=> float(19) } [5]=> array(2) { [0]=> string(4) "2014" [1]=> float(8) } [6]=> array(2) { [0]=> string(4) "2015" [1]=> float(8) } } [1]=> // <------------ THIS ONE IS 1 BY PURE LUCK array(4) { [0]=> array(2) { [0]=> string(4) "2012" [1]=> float(1) } [1]=> array(2) { [0]=> string(4) "2013" [1]=> float(1) } [2]=> array(2) { [0]=> string(4) "2014" [1]=> float(2) } [3]=> array(2) { [0]=> string(4) "2015" [1]=> float(1) } } } 的情况下按日期重新排序数组?问题是,array_multisort文档声明:

  

注意:将保留字符串键,但数字键将是   重新编制索引,从0开始并增加1。

我应该在这里使用array_multisort吗?这只是两个项目的示例,但我可以获得很多要重新排序的项目。

提前致谢。

2 个答案:

答案 0 :(得分:2)

假设每个子数组中的年份已按您的示例排序,uasort()将如下所示:

<?php

//Definition of the custom sort function
function my_sort($a,$b)
{
    //By using $a[0][0] you access the the first year entry of your subarray. It requires the sub-array to be sorted accordingly.
    if ($a[0][0] == $b[0][0]) return 0;
    return ( (int) $a[0][0] < (int) $b[0][0] ) ? -1 : 1;
}

//Setting up the array
$arr = array(
  1=>array(
        array("2012",(float) 1),
        array("2013",(float) 1),
        array("2014",(float) 2),
        array("2015",(float) 1)
        ),
  2=>array(
        array("2009",(float) 7),
        array("2010",(float) 2),
        array("2011",(float) 2),
        array("2012",(float) 0),
        array("2013",(float) 19),
        array("2014",(float) 8),
        array("2015",(float) 8)     
        ),

  );

//calling the sort function
uasort($arr,"my_sort");

//output
var_dump($arr);

?>

如果未对子数组进行排序,则需要首先遍历数组以对其进行排序,或修改my_sort()函数以查找子数组中最早的年份,而不是仅使用$a[0][0]

答案 1 :(得分:0)

使用uasort以保持索引:

$years = [
  [2013, 2015],
  [2009, 2012]
];

uasort($years, function($a, $b) {
  return min($a) - min($b);
});