改变数组的形式(PHP)
Change the form of an array (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)
如您所见,我想添加子数组、重新排序结构并删除键。起始数组值发生变化,因此可能会有更多 dates/less 日期和数字。还有它的链接,密钥 0 应该用密钥 3 批量处理,密钥 1 用密钥 4 批量处理等等。我认为这些信息已经足够了。
PS:我正在尝试为图表 PHP 的条形图 (http://www.chartphp.com/) 安排数据。
我的方法如下:
- 使用 foreach 循环遍历数组值并找出第一个数字何时开始(在本例中,它是 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);
?>
这应该适合你:
因为很明显我要假设,您预期结果背后的模式应该是将数字与按 ASC 排序的日期相结合。
所以在这里我首先将所有日期放入一个数组中,其中 preg_grep()
. Then I also get the numbers by getting the array_diff()
来自原始数组和日期数组。
然后我对数组 ASC 和 $dates
数组进行排序 usort()
where I compare the timestampes which I get with strtotime()
and the $numbers
array I sort simply with 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
)
)
我的 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)
如您所见,我想添加子数组、重新排序结构并删除键。起始数组值发生变化,因此可能会有更多 dates/less 日期和数字。还有它的链接,密钥 0 应该用密钥 3 批量处理,密钥 1 用密钥 4 批量处理等等。我认为这些信息已经足够了。
PS:我正在尝试为图表 PHP 的条形图 (http://www.chartphp.com/) 安排数据。
我的方法如下:
- 使用 foreach 循环遍历数组值并找出第一个数字何时开始(在本例中,它是 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);
?>
这应该适合你:
因为很明显我要假设,您预期结果背后的模式应该是将数字与按 ASC 排序的日期相结合。
所以在这里我首先将所有日期放入一个数组中,其中 preg_grep()
. Then I also get the numbers by getting the array_diff()
来自原始数组和日期数组。
然后我对数组 ASC 和 $dates
数组进行排序 usort()
where I compare the timestampes which I get with strtotime()
and the $numbers
array I sort simply with 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
)
)