Hagith
4/4/2013 - 8:31 AM

Convert array condition (similar to mongo where) to SQL where clause.

Convert array condition (similar to mongo where) to SQL where clause.

<?php

$def = array(
    ':ageGroup',
    '$or' => array(
        ':nature',
        ':need',
    ),
);
var_dump($def, arrayConditionToString($def)); echo "\n\n";

$def = array(
    ':ageGroup',
    ':nature',
    ':need',    
);
var_dump($def, arrayConditionToString($def)); echo "\n\n";

$def = array(
    '$or' => array(
        ':nature',
        ':need',
    ),  
);
var_dump($def, arrayConditionToString($def)); echo "\n\n";

$def = array(
    ':test',
    '$or' => array(
        ':nature',
        ':need',
        array(
            ':test1',
            ':test2'
        ),
    ),  
);
var_dump($def, arrayConditionToString($def)); echo "\n\n";

$def = array(
    ':test',
);
var_dump($def, arrayConditionToString($def)); echo "\n\n";

$def = array(
    '$or' => ':test',
);
var_dump($def, arrayConditionToString($def)); echo "\n\n";

$def = array();
var_dump($def, arrayConditionToString($def)); echo "\n\n";
<?php

function arrayConditionToString(array $def, array &$parts = array(), $operator = 'AND')
{
    foreach ($def as $k => $v) {

        if (is_string($v) && 0 === strpos($v, ':')) {
            $parts[] = ' (' . $v . ') ';
        }

        if (is_array($v)) {
            if (0 === strpos($k, '$')) {
                $subOperator = strtoupper(substr($k, 1));
            } else {
                $subOperator = 'AND';
            }

            $subPart = array();
            arrayConditionToString($v, $subPart, $subOperator);
            if (count($subPart)) {
                $parts[] = ' (' . implode($subOperator, $subPart) . ') ';
            }
        }
    }

    if (count($parts)) {
        $parts = array(implode($operator, $parts));
    }

    return reset($parts);
}