I have this array, and I would like to make a new array with date values, but whenever a STOPSALES value is reached, create a new subarray/group, and only store date values.
[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"
I will like to have this result
[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"
I tried for hours with foreach and if statments, but can't find the way.
This was my best aproach.
$res = [];
$num = 0;
foreach ($array as $go) {
if ($go == 'STOPSALES') {
continue;
} else {
$num = $num+1;
array_push($res[$num],$go);
}
}
var_export($result);
Push reference variables into the result array so that you don't need to maintain/increment a counter variable and a toggling boolean variable.
The following code will only destroy the reference when a STOPSALES
value is encountered. For all other values, it will either create and push a new reference or simply push the new value into the existing reference.
Code: (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);
Since you are dealing with an indexed input array, you can conditionally check the value if the previous index and bump the result array group's first level key when pushing the current value.
Code: (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);