/**
  * Constructor
  *
  * The param should be an array of arrays (NOT assoc arrays)
  *
  * @param array   $array
  */
 function __construct($array)
 {
     if (!is_array($array)) {
         throw new Exception('Must pass an array');
     }
     if (count($array) && air2_is_assoc_array($array[0])) {
         throw new Exception('Array objects mustnt be assoc arrays!');
     }
     $this->input = $array;
 }
/**
 * Helper function to validate air2 json variables.  Includes 4 tests.
 * 
 * @param string|assoc-array $json_obj
 * @param string $name subname to identify the test
 */
function validate_json($json, $name)
{
    if (is_string($json)) {
        $json = json_decode($json, true);
    }
    ok(air2_is_assoc_array($json), "{$name} json check - json OK");
    ok(isset($json['radix']), "{$name} json check - radix");
    ok(isset($json['meta']), "{$name} json check - metaData");
    if (isset($json['meta']['total'])) {
        ok(!air2_is_assoc_array($json['radix']), "{$name} json check - multiple");
    } else {
        ok(air2_is_assoc_array($json['radix']), "{$name} json check - single");
    }
}
function recursive_item_print($key, $val, $indent = 0)
{
    $pad = str_pad('', $indent);
    // case 1 - list-array - print each item
    if (is_int($key)) {
        if (air2_is_assoc_array($val)) {
            foreach ($val as $subkey => $subval) {
                recursive_item_print($subkey, $subval, $indent);
            }
        } else {
            throw new Exception("Bad item format - {$key} - {$val}");
        }
    } elseif (is_string($key)) {
        if (air2_is_assoc_array($val)) {
            echo "{$pad}<{$key}>\n";
            foreach ($val as $subkey => $subval) {
                recursive_item_print($subkey, $subval, $indent + 1);
            }
            echo "{$pad}</{$key}>\n";
        } elseif (is_array($val)) {
            foreach ($val as $subidx => $subval) {
                if (is_string($subval)) {
                    if ($key == 'media') {
                        echo "{$pad}<enclosure url='{$subval}' type='image/png' />\n";
                    } elseif ($key == 'guid') {
                        echo "{$pad}<{$key} isPermaLink=\"false\"><![CDATA[" . $subval . "]]></{$key}>\n";
                    } else {
                        echo "{$pad}<{$key}><![CDATA[" . $subval . "]]></{$key}>\n";
                    }
                } else {
                    echo "{$pad}<{$key}>\n";
                    recursive_item_print($subidx, $subval, $indent + 1);
                    echo "{$pad}</{$key}>\n";
                }
            }
        } else {
            if ($key == 'media') {
                echo "{$pad}<enclosure url='{$val}' type='image/png' />\n";
            } elseif ($key == 'guid') {
                echo "{$pad}<{$key} isPermaLink=\"false\"><![CDATA[" . $val . "]]></{$key}>\n";
            } else {
                echo "{$pad}<{$key}><![CDATA[" . $val . "]]></{$key}>\n";
            }
        }
    } else {
        throw new Exception("Bad item format - {$key} - {$val}");
    }
}
 * @cfg array $radix data to print
 * @cfg array $header (optional) headers for csv
 * @cfg string $filename (optional) filename for download
 *
 * @author rcavis
 * @package default
 */
if (!isset($csv)) {
    throw new Exception('csv var not defined');
}
if (!isset($csv['radix']) || count($csv['radix']) < 1) {
    throw new Exception('radix not defined');
}
$csv_lines = array();
// make radix an array
if (air2_is_assoc_array($csv['radix'])) {
    $csv['radix'] = array($csv['radix']);
}
// if there is a 'header' key, use that, otherwise array keys
if (isset($csv['header'])) {
    $csv_lines[] = $csv['header'];
} else {
    // add every key that doesn't point at an array
    $csv_lines[0] = array();
    foreach ($csv['radix'][0] as $key => $val) {
        if (!is_array($val)) {
            $csv_lines[0][] = $key;
        }
    }
}
$width = count($csv_lines[0]);