【问题标题】:php split array on change of value in column dataphp在列数据中的值变化时拆分数组
【发布时间】:2019-08-01 07:28:36
【问题描述】:

我正在尝试根据已知位置(列)处数据值的变化将数组数据拆分为多个数组。

$input =  array(
  array(1,2,3),
  array(4,5,3),
  array(7,8,4),
  array(9,10,4),
  array(11,12,4)
);

这里的第 3 列将值从 3 更改为 4 预期结果是有 2 个数组

$out1 = array(array(1,2,3),array(4,5,3));
$out2 = array(array(7,8,4), array(9,10,4), array(11,12,4));

由于行数是可变的,不能使用array_chunk 由于第 3 列的值是可变的,因此不能使用 array_filter 输出数组的数量也是可变的。 尝试拼接但失败...

【问题讨论】:

标签: php arrays split


【解决方案1】:

您可以使用 array_reduce 创建新数组,其中 index 将等于 items 中的最后一个数字

$new = array_reduce($input, function($c, $x) {  $c[$x[2]][] = $x; return $c; }, [] );
$out1 = $new[3];
$out2 = $new[4];

demo

但是如果数组没有排序并且你想在改变那个数字的点上拆分,代码可以是

$i = -1;
$last = null;
$new = [];
foreach($input as $x) {
    if ($x[2] != $last) {
        $i++;
        $last = $x[2];
    }
    $new[$i][] = $x;
}

demo

【讨论】:

  • 是的,这适用于问题中的常规数组。但不适用于具有键=> 值的数组,例如 $a = array(array('k1'=>1,'k2'=>2,'k3'=>3), array('k1'=>4,' k2'=>5,'k3'=>3), 数组('k1'=>7,'k2'=>8,'k3'=>4), 数组('k1'=>9,'k2' =>10,'k3'=>4));我在哪里得到未定义的偏移量:2 你能澄清一下
  • 用 end($x) 改变 $x2
  • { $c[end($x)] = $x;返回 $c; } 只输出每组的最后一个数组。演示在 . sandbox.onlinephpfunctions.com/code/…
  • 你应该像我的代码一样添加空方括号(我不能在这个手机上写它:))
【解决方案2】:

您可以将拆分索引与数组索引一起使用,

$out1 = $out2 = [];
$splitIndex = 2;
foreach($input as $k => $v){
    if($k < $splitIndex){
        $out1[] = $v;
    }else{
        $out2[] = $v;
    }
}
print_r($out1);
print_r($out2);

Working demo

输出:-

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

    [1] => Array
        (
            [0] => 4
            [1] => 5
            [2] => 3
        )

)
Array
(
    [0] => Array
        (
            [0] => 7
            [1] => 8
            [2] => 4
        )

    [1] => Array
        (
            [0] => 9
            [1] => 10
            [2] => 4
        )

    [2] => Array
        (
            [0] => 11
            [1] => 12
            [2] => 4
        )

)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    相关资源
    最近更新 更多