php - 在 PHP 中按日期重新排序数组并维护索引

标签 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 的数组中最早的年份是 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 的情况下按日期重新排序数组?问题是,作为 array_multisort文档指出:

Note: String keys will be maintained, but numeric keys will be re-indexed, starting at 0 and increase by 1.

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

提前致谢。

最佳答案

假设每个子数组中的年份已经按照您的示例进行排序,您的 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].

关于php - 在 PHP 中按日期重新排序数组并维护索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38324236/

相关文章:

javascript - 如何在数组中的全名后添加逗号?

c - 在 C++ 中填充动态大小的数组并使用值

将字符串转换为 char* 数组

javascript - JavaScript 字符串数组中的顺序差异

javascript - 获取从 php 到 javascript 查询的变量

php - 使用 PHP 触发 jQuery 函数

PHP session 变量检查不起作用

php - 如果没有唯一列不存在,MySQL插入多条记录

php - 未捕获的 PDOException

java - 使用类对象创建通用二维数组