Оценка MongoDB-подобных запросов JSON в PHP

Рассмотрим следующий (довольно сложный) запрос, выраженный в этом объекте JSON:

{
    "name": "Kindle Fire",
    "sale": true,
    "price": {
        "$gt": 199,
        "$lt": 264
    },
    "price.vat": { // bogus, just to show $a['price.vat'] == $a['price']['vat']
        "$lte": 1.2
    },
    "$or": {
        "qty": {
            "$gt": 30
        },
        "eta": {
            "$or": {
                "$lt": 3,
                "$gt": 30
            }
        }
    },
    "countriesAvailable": {
        "$in": [
            "US",
            "CA"
        ]
    }
}
Задача

Я хочу проанализировать этот JSON, чтобы он соответствовал PHP-эквиваленту (где$a мои целевые данные):

$a['name'] == 'Kindle Fire' &&
$a['sale'] == true &&
(
    $a['price'] > 199 && $a['price'] < 264
) &&
$a['price']['vat']  30 ||
    (
        $a['eta'] < 3 || $a['eta'] > 30
    )
) &&
in_array($a['countriesAvailable'], array('US', 'CA'))

У меня мало опыта в создании оценщиков выражений. Моя идея состоит в том, чтобы пройти запрос от самого внутреннего уровня до самого внешнего уровня, вызывая соответствующийОператор MongoDB методы по мере необходимости.

Если предположить,$a соответствует запросу, это будет план оценки:

$query = array();
$query['name'] = true;
$query['sale'] = true;
$query['price'] = array();
$query['price']['$gt'] = true;
$query['price']['$lt'] = true;
$query['price']['vat'] = array();
$query['price']['vat']['$lte'] = true;
$query['$or'] = array();
$query['$or']['qty'] = array();
$query['$or']['qty']['$gt'] = false;
$query['$or']['eta'] = array();
$query['$or']['eta']['$or'] = array();
$query['$or']['eta']['$or']['$lt'] = true;
$query['$or']['eta']['$or']['$gt'] = false;
$query['countriesAvailable'] = array();
$query['countriesAvailable']['$in'] = true;

Второй шаг:

$query = array();
$query['name'] = true;
$query['sale'] = true;
$query['price'] = array();
$query['price']['$gt'] = true;
$query['price']['$lt'] = true;
$query['price']['vat'] = true;
$query['$or'] = array();
$query['$or']['qty'] false;
$query['$or']['eta'] = array();
$query['$or']['eta']['$or'] true;
$query['countriesAvailable'] = true;

Третий шаг:

$query = array();
$query['name'] = true;
$query['sale'] = true;
$query['price'] = true;
$query['$or'] = array();
$query['$or']['qty'] false;
$query['$or']['eta'] true;
$query['countriesAvailable'] = true;

Четвертый шаг:

$query = array();
$query['name'] = true;
$query['sale'] = true;
$query['price'] = true;
$query['$or'] = true;
$query['countriesAvailable'] = true;

Поскольку все значения являются логическими значениями, оценка завершается возвращением.!in_array(false, $query, true)

Если есть лучший подход, дайте мне знать.

Проблема: доступ к родительским массивам ключей '

Я застрял, пытаясь получить самые внутренние элементы и соответствующий (игнорируя операторы) индекс массивадорожканапример, если я используюRecursiveIteratorIterator Я получаю правильные значения для первой итерации:

$nodes = new ArrayIterator($query);
$iterator = new RecursiveArrayIterator($nodes);
$iteratorIterator = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::LEAVES_ONLY);

print_r(iterator_to_array($iteratorIterator));

Array
(
    [name] => Kindle Fire HD
    [sale] => 1
    [$gt] => 30
    [$lt] => 3
    [$lte] => 1.2
    [0] => US
    [1] => CA
)

Тем не менее, это 'мало пользы, так как я не могу быть уверен, что$a Индекс, на который ссылаются ключи, не говоря уже о том, что значения ключей перезаписываются последними записями и тот факт, что я могу 'изменить свои значения.

мы также пытались играть сRecursiveArrayIterator, но без /hasParent()getParent() методы это не 'кажется, дает мне много преимуществ перед просто foreachв массиве.

Какие-либо предложения?

Ответы на вопрос(1)

Ваш ответ на вопрос