PHP当遇到数组中的值时,如何将数组拆分成更多的数组?

6tqwzwtp  于 2023-01-08  发布在  PHP
关注(0)|答案(2)|浏览(127)

我有一个数组,我想创建一个新的数组,其中包含日期值,但是当达到第一个停止销售值时,创建一个新的数组,其中只包含日期值。

[0]=>
  string(10) "2023-03-10"
  [1]=>
  string(10) "2023-03-11"
  [2]=>
  string(10) "2023-03-12"
  [3]=>
  string(10) "2023-03-13"
  [4]=>
  string(10) "2023-03-14"
  [5]=>
  string(10) "2023-03-15"
  [6]=>
  string(9) "STOPSALES"
  [7]=>
  string(9) "STOPSALES"
  [8]=>
  string(9) "STOPSALES"
  [9]=>
  string(9) "STOPSALES"
  [10]=>
  string(9) "STOPSALES"
  [11]=>
  string(9) "STOPSALES"
  [12]=>
  string(9) "STOPSALES"
  [13]=>
  string(9) "STOPSALES"
  [14]=>
  string(9) "STOPSALES"
  [15]=>
  string(9) "STOPSALES"
  [16]=>
  string(9) "STOPSALES"
  [17]=>
  string(10) "2023-03-27"
  [18]=>
  string(10) "2023-03-28"
  [19]=>
  string(10) "2023-03-29"
  [20]=>
  string(10) "2023-03-30"
  [21]=>
  string(10) "2023-03-31"
  [22]=>
  string(10) "2023-04-01"
  [23]=>
  string(10) "2023-04-02"
  [24]=>
  string(10) "2023-04-03"

我希望这个结果

[0]=>
  string(10) "2023-03-10"
  [1]=>
  string(10) "2023-03-11"
  [2]=>
  string(10) "2023-03-12"
  [3]=>
  string(10) "2023-03-13"
  [4]=>
  string(10) "2023-03-14"
  [5]=>
  string(10) "2023-03-15"
[1]=>
  string(10) "2023-03-27"
  [1]=>
  string(10) "2023-03-28"
  [2]=>
  string(10) "2023-03-29"
  [3]=>
  string(10) "2023-03-30"
  [4]=>
  string(10) "2023-03-31"
  [5]=>
  string(10) "2023-04-01"
  [6]=>
  string(10) "2023-04-02"
  [7]=>
  string(10) "2023-04-03"

尝试了几个小时的foreach和if语句,但找不到路。
这是我最好的办法。
我有一个数组,我想创建一个新的数组,其中包含日期值,但是当达到第一个停止销售值时,创建一个新的数组,其中只包含日期值。

$res = [];
$num = 0;
foreach ($array as $go) {
    if ($go == 'STOPSALES') {
        continue; 
    } else {
        $num = $num+1;
         array_push($res[$num],$go);
    }
}
var_export($result);

我已经添加了这段代码,以了解这是我最好的方法。我有这个数组,我想用日期值创建一个新数组,但当达到第一个停止销售值时,创建一个新数组,只使用日期值。
我有一个数组,我想创建一个新的数组,其中包含日期值,但是当达到第一个停止销售值时,创建一个新的数组,其中只包含日期值。

g6baxovj

g6baxovj1#

将引用变量推入结果数组,这样就不需要维护/增加计数器变量和切换布尔变量。
下面的代码只会在遇到STOPSALES值时销毁引用。对于所有其他值,它将创建并推送一个新引用,或者只是将新值推送到现有引用中。
代码:(Demo

$result = [];
foreach ($array as $v) {
    if ($v === 'STOPSALES') {
        unset($ref); // no longer used (if it even existed)
        continue; // nothing more to do; go to next iteration
    }
    if (!isset($ref)) {
        $ref = [$v]; // declare/populate new reference with current value
        $result[] = &$ref; // push new reference into result at next available index
    } else {
        $ref[] = $v; // add current value to current reference/group because is a consecutive date value
    }
}
var_export($result);

由于处理的是索引输入数组,因此可以有条件地检查值是否为上一个索引,并在推送当前值时转换结果数组组的第一级键。
代码:(Demo

$result = [];
$k = 0;
foreach ($array as $i => $v) {
    if ($v !== 'STOPSALES') {
        if (($array[$i - 1] ?? null) === 'STOPSALES') {
            ++$k;
        }
        $result[$k][] = $v;
    }
}
var_export($result);
isr3a4wc

isr3a4wc2#

下面是实现你的愿望的一种方法:

$array = [
    "2023-03-10",
    "2023-03-11",
    "2023-03-12",
    "2023-03-13",
    "2023-03-14",
    "2023-03-15",
    "STOPSALES",
    "STOPSALES",
    "STOPSALES",
    "STOPSALES",
    "STOPSALES",
    "STOPSALES",
    "STOPSALES",
    "STOPSALES",
    "STOPSALES",
    "STOPSALES",
    "STOPSALES",
    "2023-03-27",
    "2023-03-28",
    "2023-03-29",
    "2023-03-30",
    "2023-03-31",
    "2023-04-01",
    "2023-04-02",
    "2023-04-03",
];
$result = []; // array of subarrays
$i = 0; // incremented after a "STOPSALES"
$wasStopSales = FALSE; // to avoid creating multiple empty arrays with consecutive "STOPSALES"
foreach ($array as $element) {
    if ($element == 'STOPSALES') {
        if (!$wasStopSales) { // if that's the first consecutive "STOPSALES"
            ++$i; // let's move to another subarray
        }
        $wasStopSales = TRUE;
        continue;
    }
    $result[$i][] = $element; // add the current element to the current subarray
    $wasStopSales = FALSE; // last value wasn't a "STOPSALES"
}
var_dump($result);

结果是:

array (size=2)
  0 => 
    array (size=6)
      0 => string '2023-03-10' (length=10)
      1 => string '2023-03-11' (length=10)
      2 => string '2023-03-12' (length=10)
      3 => string '2023-03-13' (length=10)
      4 => string '2023-03-14' (length=10)
      5 => string '2023-03-15' (length=10)
  1 => 
    array (size=8)
      0 => string '2023-03-27' (length=10)
      1 => string '2023-03-28' (length=10)
      2 => string '2023-03-29' (length=10)
      3 => string '2023-03-30' (length=10)
      4 => string '2023-03-31' (length=10)
      5 => string '2023-04-01' (length=10)
      6 => string '2023-04-02' (length=10)
      7 => string '2023-04-03' (length=10)

如果你需要更多的细节,尽管问我。

相关问题