У меня есть многомерный массив, подобный этому, и я не хочу проверять, все ли значения «open_at» и «closed_at» равны NULL.
array:7 [▼
0 => array:2 [▼
0 => array:2 [▼
"open_at" => null
"closed_at" => "11:03"]
1 => array:2 [▼
"open_at" => "13:00""closed_at" => "16:00"]
]
1 => array:2 [▼
0 => array:2 [▼
"open_at" => "09:00""closed_at" => "12:00"]
1 => array:2 [▼
"open_at" => "12:30""closed_at" => "17:00"]
]
2 => array:2 [▼
0 => array:2 [▼
"open_at" => "08:00""closed_at" => "18:00"]
1 => array:2 [▼
"open_at" => null
"closed_at" => null
]
]
3 => array:2 [▼
0 => array:2 [▼
"open_at" => null
"closed_at" => null
]
1 => array:2 [▼
"open_at" => null
"closed_at" => null
]
]
...
Я пробовал с множественным циклом for и foreach, как, без успеха …
for ( $i = 0; $i <6 ; $i++) {
for ($j = 0; $j < 2; $j++) {
if(empty($hours[$i][$j]["open_at"])){
$null="complete";
}
else{
$null="empty";
}
return $null;
}
}
Массив следует проверять как пустой только в том случае, если все значения «open_at» и «closed_at» установлены в NULL.
Как видно из приведенного выше примера, первые значения могут быть установлены в NULL, но в этом случае массив не должен проверяться как пустой.
Цель состоит в том, чтобы не выполнять приведенный ниже код, только если все «open_at» и «closed_at» установлены в NULL.
$hours = $request->get('hours');
//check if empty here
foreach ($hours as $key => $period) {
foreach($period as $attribute => $value){
$shops_hour = new Shops_hour();
$shops_hour->shop_id=$shop->id;
$shops_hour->day=$key;
$shops_hour->period=$attribute;
$shops_hour->open_at=$hours[$key][$attribute]["open_at"];
$shops_hour->closed_at=$hours[$key][$attribute]["closed_at"];
$shops_hour->save();
}
}
Заранее спасибо,
Использование рекурсивной функции, которая вернет true, если все содержащиеся в ней значения равны нулю:
function all_null_recursive($arr)
{
foreach ($arr as $item) {
/* if the item is an array
and the function itself found something different from null */
if (is_array($item) && all_null_recursive($item) === false) {
return false;
// if the item is not an array and different from null
} elseif (!is_array($item) && $item !== null) {
return false;
}
}
// always found null, everything's good
return true;
}
Тестирование:
2 массива для тестирования.
$foo = [
0 => [
0 => [
"open_at" => null,
"closed_at" => "11:03"],
1 => [
"open_at" => "13:00",
"closed_at" => "16:00"],
],
1 => [
0 => [
"open_at" => "09:00",
"closed_at" => "12:00"],
1 => [
"open_at" => "12:30",
"closed_at" => "17:00"],
],
2 => [
0 => [
"open_at" => "08:00",
"closed_at" => "18:00"],
1 => [
"open_at" => null,
"closed_at" => null
],
],
3 => [
0 => [
"open_at" => null,
"closed_at" => null
],
1 => [
"open_at" => null,
"closed_at" => null
]
]
];
$foo_2 = [
0 => [
0 => [
"open_at" => null,
"closed_at" => null
],
1 => [
"open_at" => null,
"closed_at" => null
],
],
1 => [
0 => [
"open_at" => null,
"closed_at" => null
],
1 => [
"open_at" => null,
"closed_at" => null
],
],
2 => [
0 => [
"open_at" => null,
"closed_at" => null
],
1 => [
"open_at" => null,
"closed_at" => null
],
],
3 => [
0 => [
"open_at" => null,
"closed_at" => null
],
1 => [
"open_at" => null,
"closed_at" => null
]
]
];
Тестирование:
var_dump(all_null_recursive($foo)); // bool(false)
var_dump(all_null_recursive($foo_2)); // bool(true)
Метод @jeff работает, спасибо
$foundOneWithaValue = "0";
foreach ($hours as $key => $period) {
foreach($period as $attribute => $value){
if(!empty($hours[$key][$attribute]["open_at"]) || (!empty($hours[$key][$attribute]["closed_at"])) ) {
$foundOneWithaValue ++;
}
}
}
if($foundOneWithaValue != 0)
{
foreach ($hours as $key => $period) {
foreach($period as $attribute => $value){
$shops_hour = new Shops_hour();
$shops_hour->shop_id=$shop->id;
$shops_hour->day=$key;
$shops_hour->period=$attribute;
$shops_hour->open_at=$hours[$key][$attribute]["open_at"];
$shops_hour->closed_at=$hours[$key][$attribute]["closed_at"];
$shops_hour->save();
}
}
}