fork download
  1. <?php
  2.  
  3. $dados =
  4. [
  5. 'dados-0'=> [
  6. 'valor-0' => 300, 'date-0' => '26/2/2019'
  7. ],
  8. 'dados-1'=> [
  9. 'valor-1' => 150, 'date-1' => '26/2/2019'
  10. ],
  11. 'dados-2'=> [
  12. 'valor-2' => 150, 'date-2' => '26/3/2019'
  13. ],
  14. 'dados-3'=> [
  15. 'valor-3' => 5000, 'date-3' => '9/3/2019'
  16. ],
  17. 'dados-4'=> [
  18. 'valor-4' => 300, 'date-4' => '10/3/2019'
  19. ]
  20. ];
  21.  
  22.  
  23. // função que aplica uma função passada por parâmetro em todos os elementos do array
  24. function array_map_recursive(callable $func, array $array){
  25. $res = [];
  26. foreach ($array as $k => $v)
  27. $res[$k] = is_array($v) ? array_map_recursive($func, $v) : $func(trim($v));
  28. return $res;
  29. }
  30.  
  31. // função que recupera a primeira data encontrada em um array
  32. function getDataInArray(array $array){
  33. foreach($array as $val){
  34. if(is_array($val)) return getDataInArray($array);
  35. if(preg_match('/\d{2,4}\-\d{1,2}\-\d{1,2}(?=$)/', $val)) return $val;
  36. }
  37. return false;
  38. }
  39.  
  40. // altera o array para ser ordenado ( formato será por exemplo 2015-02-30 )
  41. $new = array_map_recursive(function($v){
  42. // identifica se é uma data. Se for uma data retorna uma nova data com o formato americano.
  43. return preg_match('/\d{1,2}\/\d{1,2}\/\d{2,4}(?=$)/', $v) ? date("Y-m-d", strtotime(str_replace("/", "-", $v))) : $v;
  44. }, $dados);
  45.  
  46. // ordena o array preservando as chaves
  47. uasort($new, function($a,$b){
  48. return strcmp(getDataInArray($a), getDataInArray($b));
  49. });
  50.  
  51. // altera o array para ser usado ( formato será por exemplo 30/02/2015 )
  52. $dados = array_map_recursive(function($v){
  53. // identifica se é uma data. Se for uma data retorna uma nova data com o formato brasileiro.
  54. return preg_match('/\d{2,4}\-\d{1,2}\-\d{1,2}(?=$)/', $v) ? date("d/m/Y", strtotime(str_replace("/", "-", $v))) : $v;
  55. }, $new);
  56.  
  57. // exibe
  58. print_r($dados);
Success #stdin #stdout 0s 82752KB
stdin
Standard input is empty
stdout
Array
(
    [dados-0] => Array
        (
            [valor-0] => 300
            [date-0] => 26/02/2019
        )

    [dados-1] => Array
        (
            [valor-1] => 150
            [date-1] => 26/02/2019
        )

    [dados-3] => Array
        (
            [valor-3] => 5000
            [date-3] => 09/03/2019
        )

    [dados-4] => Array
        (
            [valor-4] => 300
            [date-4] => 10/03/2019
        )

    [dados-2] => Array
        (
            [valor-2] => 150
            [date-2] => 26/03/2019
        )

)