Изменить форму массива (PHP)

У меня есть огромная, сложная проблема в моем приложении php. Вот подробности:

В настоящее время у меня есть это как мой массив (вар дамп):

array (size=6)
0 => string '11/04/15' (length=8)
1 => string '15/04/15' (length=8)
2 => string '19/04/15' (length=8)
3 => string '1' (length=1)
4 => string '1' (length=1)
5 => string '3' (length=1)

Но я хочу, чтобы это отображалось как:

array (size=6)
array(size=2)
string '11/04/15' (length=8)
string '1' (length=1)
array(size=2)
string '15/04/15' (length=8)
string '1' (length=1)
array(size=2)
string '19/04/15' (length=8)
string '3' (length=1)

Как вы можете видеть, я хотел бы добавить вложенные массивы, изменить порядок структуры и удалить ключи. Значения начального массива меняются, поэтому может быть больше дат / меньше дат и чисел. Кроме того, он связан, ключ 0 должен быть заполнен ключом 3, а ключ 1 заполнен ключом 4 и т. Д. Я думаю, этого достаточно.

PS: я пытаюсь упорядочить данные для диаграммы гистограммы PHP (http://www.chartphp.com/).

-1

Решение

Это должно работать для вас:

Поскольку это довольно очевидно, я собираюсь предположить, что закономерность ваших ожидаемых результатов должна заключаться в объединении чисел с датами, которые отсортированы ASC.

Итак, здесь я сначала получаю все даты в массив с preg_grep(). Тогда я также получаю цифры, получая array_diff() из исходного массива и массива дат.

Затем я сортирую оба массива ASC и $dates массив я сортирую usort() где я сравниваю временные метки, которые я получаю с strtotime() и $numbers массив я сортирую просто sort().

В конце я просто перебираю оба массива с помощью array_map() где я тогда создаю ожидаемый результат.

<?php

$arr = [
"19/04/15",
"11/04/15",
"15/04/15",
"3",
"1",
"1",
];

$dates = preg_grep("/\d{2}\/\d{2}\/\d{2}/", $arr);
$numbers = array_diff($arr, $dates);

sort($numbers);
usort($dates, function($a, $b){
if(strtotime($a) == strtotime($b))
return 0;
return strtotime($a) < strtotime($b) ? 1 : -1;
});

$result = array_map(function($v1, $v2){
return [$v1, $v2];
}, $dates, $numbers);

print_r($result);

?>

выход:

Array
(
[0] => Array
(
[0] => 11/04/15
[1] => 1
)

[1] => Array
(
[0] => 15/04/15
[1] => 1
)

[2] => Array
(
[0] => 19/04/15
[1] => 3
)

)
0

Другие решения

Мой подход будет следующим:

  1. Просмотрите значения массива с помощью цикла foreach и выясните, когда начинается первое число (в данном случае это элемент 4.)
  2. Сохраните число внутри переменной.
  3. Создать новый массив
  4. Пройдите старый массив снова и получите пары, затем вставьте их в новый массив.

Код будет похож на это:

<?
$old = array("date1","date2","date3",1,2,3);
$n = null;
foreach($old as $k => $v){
if(/*CHECK HERE IF $v is NOT A DATE anymore*/){
$n = $k;
break;
}
}
$new = array();
foreach($old as $k => $v){
if($k < $n){
$temp = array($v, $old[$k+$n]);
array_push($new, $temp);
}
}
var_dump ($new);
?>
1