У меня есть огромная, сложная проблема в моем приложении 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/).
Это должно работать для вас:
Поскольку это довольно очевидно, я собираюсь предположить, что закономерность ваших ожидаемых результатов должна заключаться в объединении чисел с датами, которые отсортированы 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
)
)
Мой подход будет следующим:
Код будет похож на это:
<?
$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);
?>