Как проверить многомерный массив на требуемые значения? - PullRequest
0 голосов
/ 20 июня 2019

Справочная информация и цель

Если вам нужно больше контекста, вы можете просмотреть последние изменения этого вопроса.В попытках сделать этот минимальный воспроизводимый пример , я немного его урезал.

Мне нужна функция 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]

...