function kintParser::_parse_array
File
-
kint/
kint/ inc/ kintParser.class.php, line 272
Class
Code
private static function _parse_array(&$variable, kintVariableData $variableData) {
isset(self::$_marker) or self::$_marker = "\x00" . uniqid();
# naturally, $GLOBALS variable is an intertwined recursion nightmare, use black magic
$globalsDetector = false;
if (array_key_exists('GLOBALS', $variable) && is_array($variable['GLOBALS'])) {
$globalsDetector = "\x01" . uniqid();
$variable['GLOBALS'][$globalsDetector] = true;
if (isset($variable[$globalsDetector])) {
unset($variable[$globalsDetector]);
self::$_dealingWithGlobals = true;
}
else {
unset($variable['GLOBALS'][$globalsDetector]);
$globalsDetector = false;
}
}
$variableData->type = 'array';
$variableData->size = count($variable);
if ($variableData->size === 0) {
return;
}
if (isset($variable[self::$_marker])) {
# recursion; todo mayhaps show from where
if (self::$_dealingWithGlobals) {
$variableData->value = '*RECURSION*';
}
else {
unset($variable[self::$_marker]);
$variableData->value = self::$_marker;
}
return false;
}
if (self::_checkDepth()) {
$variableData->extendedValue = "*DEPTH TOO GREAT*";
return false;
}
$isSequential = self::_isSequential($variable);
if ($variableData->size > 1 && ($arrayKeys = self::_isArrayTabular($variable)) !== false) {
$variable[self::$_marker] = true;
# this must be AFTER _isArrayTabular
$firstRow = true;
$extendedValue = '<table class="kint-report"><thead>';
foreach ($variable as $rowIndex => &$row) {
# display strings in their full length
self::$_placeFullStringInValue = true;
if ($rowIndex === self::$_marker) {
continue;
}
if (isset($row[self::$_marker])) {
$variableData->value = "*RECURSION*";
return false;
}
$extendedValue .= '<tr>';
if ($isSequential) {
$output = '<td>' . '#' . ($rowIndex + 1) . '</td>';
}
else {
$output = self::_decorateCell(kintParser::factory($rowIndex));
}
if ($firstRow) {
$extendedValue .= '<th> </th>';
}
# we iterate the known full set of keys from all rows in case some appeared at later rows,
# as we only check the first two to assume
foreach ($arrayKeys as $key) {
if ($firstRow) {
$extendedValue .= '<th>' . self::escape($key) . '</th>';
}
if (!array_key_exists($key, $row)) {
$output .= '<td class="kint-empty"></td>';
continue;
}
$var = kintParser::factory($row[$key]);
if ($var->value === self::$_marker) {
$variableData->value = '*RECURSION*';
return false;
}
elseif ($var->value === '*RECURSION*') {
$output .= '<td class="kint-empty"><u>*RECURSION*</u></td>';
}
else {
$output .= self::_decorateCell($var);
}
unset($var);
}
if ($firstRow) {
$extendedValue .= '</tr></thead><tr>';
$firstRow = false;
}
$extendedValue .= $output . '</tr>';
}
self::$_placeFullStringInValue = false;
$variableData->extendedValue = $extendedValue . '</table>';
}
else {
$variable[self::$_marker] = true;
$extendedValue = array();
foreach ($variable as $key => &$val) {
if ($key === self::$_marker) {
continue;
}
$output = kintParser::factory($val);
if ($output->value === self::$_marker) {
$variableData->value = "*RECURSION*";
// recursion occurred on a higher level, thus $this is recursion
return false;
}
if (!$isSequential) {
$output->operator = '=>';
}
$output->name = $isSequential ? null : "'" . $key . "'";
$extendedValue[] = $output;
}
$variableData->extendedValue = $extendedValue;
}
if ($globalsDetector) {
self::$_dealingWithGlobals = false;
}
unset($variable[self::$_marker]);
}