private static function _parse_array(&$variable, kintVariableData $variableData) { isset(self::$_marker) or self::$_marker = "" . 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 = "" . 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); $tabular = self::_isArrayTabular($variable); if ($tabular) { $firstRow = true; $extendedValue = '<table class="kint-report">'; $arrayKeys = array(); // assure no values are unreported if an extra key appears in one of the lines foreach ($variable as $row) { // todo process all keys in _isArrayTabular() if (!is_array($row)) { $tabular = false; break; } $arrayKeys = array_unique(array_merge($arrayKeys, array_keys($row))); if (Kint::$keyFilterCallback) { foreach ($arrayKeys as $k => $key) { if (call_user_func(Kint::$keyFilterCallback, $key) === false) { unset($arrayKeys[$k]); } } } } } if ($tabular) { $variable[self::$_marker] = true; foreach ($variable as $rowIndex => &$row) { if ($rowIndex === self::$_marker) { continue; } if (isset($row[self::$_marker])) { $variableData->value = "*RECURSION*"; return false; } $extendedValue .= '<tr>'; $output = '<td>' . ($isSequential ? '#' . ($rowIndex + 1) : $rowIndex) . '</td>'; if ($firstRow) { $extendedValue .= '<th> </th>'; } 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; } # display strings in their full length so as not to trigger rich decoration $maxStrLength = kint::$maxStrLength; kint::$maxStrLength = false; $var = kintParser::factory($row[$key]); kint::$maxStrLength = $maxStrLength; if ($var->value === self::$_marker) { $variableData->value = '*RECURSION*'; return false; } elseif ($var->value === '*RECURSION*') { $output .= '<td class="kint-empty">' . Kint_Decorators_Concise::decorate($var) . '</td>'; } else { $output .= '<td>' . Kint_Decorators_Concise::decorate($var) . '</td>'; } unset($var); } if ($firstRow) { $extendedValue .= '</tr><tr>'; $firstRow = false; } $extendedValue .= $output . '</tr>'; } $variableData->extendedValue = $extendedValue . '</table>'; } else { $variable[self::$_marker] = true; $extendedValue = array(); foreach ($variable as $key => &$val) { if ($key === self::$_marker || Kint::$keyFilterCallback && call_user_func(Kint::$keyFilterCallback, $key, $val) === false) { 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 : "'" . self::_escape($key) . "'"; $extendedValue[] = $output; } $variableData->extendedValue = $extendedValue; } if ($globalsDetector) { self::$_dealingWithGlobals = false; } unset($variable[self::$_marker]); }
private static function _parse_array(&$variable, kintVariableData $variableData) { isset(self::$_marker) or self::$_marker = "" . 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 = "" . 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]); }