Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中将数据从主数组传递到多个数组_Php_Arrays_Function_Merge - Fatal编程技术网

如何在PHP中将数据从主数组传递到多个数组

如何在PHP中将数据从主数组传递到多个数组,php,arrays,function,merge,Php,Arrays,Function,Merge,我有一个带有子数组的数组,每个子数组都有“type”(int)和“datetime”。我需要循环trought数组,并以一种特殊的方式创建包含这些子数组组的新数组(或对象):每个“类型”都可以是[0-3]0表示开始日期,3表示结束日期(1和2之间用于其他目的)。具有这些子阵列的每个新阵列都应以0开始,以3结束 我不使用任何框架,只使用PHP5和jQuery。主数组来自一个循环,我是通过一个带有GROUP_CONCAT的SQL查询生成的。我刚刚将concat字段传递给一个主数组,但我需要重新组合子

我有一个带有子数组的数组,每个子数组都有“type”(int)和“datetime”。我需要循环trought数组,并以一种特殊的方式创建包含这些子数组组的新数组(或对象):每个“类型”都可以是[0-3]0表示开始日期,3表示结束日期(1和2之间用于其他目的)。具有这些子阵列的每个新阵列都应以0开始,以3结束

我不使用任何框架,只使用PHP5和jQuery。主数组来自一个循环,我是通过一个带有GROUP_CONCAT的SQL查询生成的。我刚刚将concat字段传递给一个主数组,但我需要重新组合子数组以创建某种类型的注册表

这是我用子数组得到的数组。它们已按日期时间排序,每个类型“0”表示“开始日期/开始新注册表”,“3”表示“结束日期/结束注册表”

我需要通过注册表创建一个包含子数组或对象的新数组,注册表是一个具有startdate(类型0)、介于someDate(类型1,2)和enddate(类型3)之间的元素。重要的是,下一个子阵列的startdate比旧的子阵列enddate更为最新。每个“tipo”+“fechahora”数组都有更多字段(签名、地址等),因此我需要将这些字段保留为子数组:

$newarray = [
    'registry0' => [ 
            "startdate"=> ["tipo"=>0,"fechahora"=>"2019-05-26 09:35:30"],
            "pauses"=> [
                ["tipo"=>1,"fechahora"=>"2019-05-26 10:30:15"],
                ["tipo"=>2,"fechahora"=>"2019-05-26 10:43:12"]
            ],
            "enddate" => ["tipo"=>3,"fechahora"=>"2019-05-26 14:30:26"]
        ],
    'registry1' => [ 
            "startdate"=> ["tipo"=>0,"fechahora"=>"2019-05-26 15:35:22"],
            "pauses"=> [],
            "enddate" => ["tipo"=>3,"fechahora"=>"2019-05-26 16:35:31"]
        ],
    'registry2' => [  
            "startdate"=> ["tipo"=>0,"fechahora"=>"2019-05-27 08:31:57"],
            "pauses"=> [
                ["tipo"=>1,"fechahora"=>"2019-05-27 10:27:22"],
                ["tipo"=>2,"fechahora"=>"2019-05-27 10:38:31"]
            ],
            "enddate" => ["tipo"=>3,"fechahora"=>"2019-05-27 14:20:38"]
    ]
];
我可以使用数组或对象,我不知道如何开发一个循环来像这样重新组合数组(从一个字段值开始,以另一个字段值结束,依此类推)。我甚至不知道有没有更简单的方法。任何帮助都将不胜感激

如果这有帮助的话:我需要以这种方式将注册表放入一个HTML表中,每个注册表排成一行

编辑:

我知道我必须使用循环,但我不知道如何“获取类型为0的第一个元素,创建数组,包含元素,包含所有其他元素直到类型3,关闭数组,创建新数组,等等…”

在某些代码中:

$newarray = [];
foreach($array as $element) {
if ($element["tipo"]==0) {
  //new subarray
  //include this in subarray
}
// include all "tipos" 1,2 in subarray
if ($element["tipo"]==3) {
  //include this in subarray
  //finish subarray
}
//incude subarray in $newarray
}
return $newarray;

我不知道如何继续。

这只是在每个原始数组值上循环,并在临时数组中创建一个条目(本例中为
$temp
),根据类型使用任何值。然后,当找到类型3时,将其添加到
$newarray

$newarray = [];
$temp = [];
$count = 0;
foreach ( $array as $entry )    {
    if ( $entry['tipo'] == 0 )  {
        $temp = [ 'startdate' => $entry ];
    }
    else if ( $entry['tipo'] == 3 ) {
        $temp["enddate"] = $entry;
        $newarray["registry".$count++] = $temp;
    }
    else    {
        $temp["pauses"][] = $entry;
    }
}

对于这种情况,一个简单的foreach后跟switch case即可

$result = [];
$i      = 0;
$var = 3; // you can manage this at your will
foreach ($array as $key => $value) {
    switch ($value['tipo']) { // passing tipo value here
        case 0:
            // it will capture for same record for current value of $i
            $result['registry' . $i]['startdate'] = $value; 
            break;
        case $var:
            // detects last entry and will increment
            $result['registry' . $i++]['enddate'] = $value; 
            break;
        default:
            // if not 0 and $var then push it in pauses
            $result['registry' . $i]['pauses'][] = $value; 
            break;
    }
}

.

循环非常简单,您是否尝试过?但是使用
0
1
等而不是
registry0
registry1
会更简单、更有意义
$result = [];
$i      = 0;
$var = 3; // you can manage this at your will
foreach ($array as $key => $value) {
    switch ($value['tipo']) { // passing tipo value here
        case 0:
            // it will capture for same record for current value of $i
            $result['registry' . $i]['startdate'] = $value; 
            break;
        case $var:
            // detects last entry and will increment
            $result['registry' . $i++]['enddate'] = $value; 
            break;
        default:
            // if not 0 and $var then push it in pauses
            $result['registry' . $i]['pauses'][] = $value; 
            break;
    }
}