Справочная информация и цель
Если вам нужно больше контекста, вы можете просмотреть последние изменения этого вопроса.В попытках сделать этот минимальный воспроизводимый пример , я немного его урезал.
Мне нужна функция check()
для проверки многомерного массива, чтобы увидеть, имеет ли он«обязательные» ключи, и если значение этих ключей не равно нулю.
Итак ... есть:
$subject
: массив, который будет проверен $required
: массив, который будет использоваться для проверки $subject
check()
: функция, которая принимает оба приведенных выше аргумента и "сравнивает"
Проблемы &Мнение
Структура массива $subject
является многомерной и неоднородной.Один ключ первого уровня может иметь одно значение ... или это может быть массив массивов массивов массивов и т. Д. ... Учитывая это, функция check()
, похоже, нуждается в рекурсивном характере.
Основная проблема
Я борюсь с тем, как сделать эту работу рекурсивной или, если это возможно / лучшим вариантом, чтобы избежать бесконечных уровней if
условий / foreach
циклы.
«Основная проблема» объясняется подробнее / показана в коде под комментарием «/ * ОСНОВНАЯ ПРОБЛЕМА ЗДЕСЬ * /»
Функция
function check($subject, $required) {
foreach ($required as $main_key => $main_val) {
// need to iterate through more dimensions
if (is_array($main_val)) {
foreach ($main_val as $sub_key => $sub_val) {
/* MAIN PROBLEM HERE */
// $sub_val COULD be another array if there was another dimension to $subject ...
// I need an alternative to avoid infinite if conditions / foreach loops
if (!isset($subject[$main_key][$sub_val])) {
echo "ERROR: Required value is null: {$main_key}[{$sub_val}]";
return false;
}
}
// no more dimensions to iterate through
} else {
if (!isset($subject[$main_val])) {
echo "ERROR: Required value is null: {$main_val}";
return false;
}
}
}
// all required values are set
return true;
}
Пример ввода и вывода
/**
* Example - no errors
*/
// our subject
$product_info = array(
// 3 dimensions
'other' => array('discount' => array('amount' => 10, 'enabled' => true)),
// 2 dimensions
'prices' => array('cash' => '100', 'credit' => '103'),
// 1 dimension
'quantity' = 10
);
// our requirements
$required = array(
// 3 dimensions
'other' => array('discount' => array('amount', 'enabled')),
// 2 dimensions
'prices' => array('cash', 'credit'),
// 1 dimension
'quantity'
);
// check the array
$x = check($product_info, $required);
// Output:
/**
* Example - missing input // see that prices[credit] is commented out
*/
// our subject
$product_info = array(
// 3 dimensions
'other' => array('discount' => array('amount' => 10, 'enabled' => true)),
// 2 dimensions
// prices[credit] is commented out
'prices' => array('cash' => '100', /*'credit' => '103'*/),
// 1 dimension
'quantity' = 10
);
// our requirements
$required = array(
// 3 dimensions
'other' => array('discount' => array('amount', 'enabled')),
// 2 dimensions
// see here that we require prices[credit]
'prices' => array('cash', 'credit'),
// 1 dimension
'quantity'
);
// check the array
$x = check($product_info, $required);
// Output: ERROR: Required value is null: prices[credit]