src/Debug/MethodTable.php
public static function keyValues($row, $keys, &$objInfo)
    {
        $objInfo = array(
            'row' => false,
            'cols' => array(),
        );
        $rowIsAbstraction = Abstracter::isAbstraction($row);
        if ($rowIsAbstraction) {
            if ($row['type'] == 'object') {
                $objInfo['row'] = array(
                    'className' => $row['className'],
                    'phpDoc' => $row['phpDoc'],
                );
                $row = self::objectValues($row);
                if (!\is_array($row)) {
                    // ie stringified value
                    $objInfo['row'] = false;
                    $row = array(self::SCALAR => $row);
                } elseif (Abstracter::isAbstraction($row)) {
                    // still an abstraction (ie closure)
                    $objInfo['row'] = false;
                    $row = array(self::SCALAR => $row);
                }
            } else {
                // resource & callable
                $row = array(self::SCALAR => $row);
            }
        }
        if (!\is_array($row)) {
            $row = array(self::SCALAR =>  $row);
        }
        $values = array();
        foreach ($keys as $key) {
            if (\array_key_exists($key, $row)) {
                $value = $row[$key];
                if ($value !== null) {
                    // by setting to false :
                    //    indicate that the column is not populated by objs of the same type
                    //    if stringified abstraction, we'll set cols[key] below
                    $objInfo['cols'][$key] = false;
                }
                if (Abstracter::isAbstraction($value)) {
                    // just return the stringified / __toString value in a table
                    if (isset($value['stringified'])) {
                        $objInfo['cols'][$key] = $value['className'];
                        $value = $value['stringified'];
                    } elseif (isset($value['__toString']['returnValue'])) {
                        $objInfo['cols'][$key] = $value['className'];
                        $value = $value['__toString']['returnValue'];
                    }
                }
            } else {
                $value = Abstracter::UNDEFINED;
            }
            $values[$key] = $value;
        }
        return $values;
    }
public static function keyValues($row, $keys, &$objInfo)
    {
        $objInfo = array(
            'row' => false,
            'cols' => array(),
        );
        $rowIsAbstraction = Abstracter::isAbstraction($row);
        if ($rowIsAbstraction) {
            if ($row['type'] == 'object') {
                $objInfo['row'] = array(
                    'className' => $row['className'],
                    'phpDoc' => $row['phpDoc'],
                );
                $row = self::objectValues($row);
                if (!\is_array($row)) {
                    // ie stringified value
                    $objInfo['row'] = false;
                    $row = array(self::SCALAR => $row);
                } elseif (Abstracter::isAbstraction($row)) {
                    // still an abstraction (ie closure)
                    $objInfo['row'] = false;
                    $row = array(self::SCALAR => $row);
                }
            } else {
                // resource & callable
                $row = array(self::SCALAR => $row);
            }
        }
        if (!\is_array($row)) {
            $row = array(self::SCALAR =>  $row);
        }
        $values = array();
        foreach ($keys as $key) {
            if (\array_key_exists($key, $row)) {
                $value = $row[$key];
                if ($value !== null) {
                    // by setting to false :
                    //    indicate that the column is not populated by objs of the same type
                    //    if stringified abstraction, we'll set cols[key] below
                    $objInfo['cols'][$key] = false;
                }
                if (Abstracter::isAbstraction($value)) {
                    // just return the stringified / __toString value in a table
                    if (isset($value['stringified'])) {
                        $objInfo['cols'][$key] = $value['className'];
                        $value = $value['stringified'];
                    } elseif (isset($value['__toString']['returnValue'])) {
                        $objInfo['cols'][$key] = $value['className'];
                        $value = $value['__toString']['returnValue'];
                    }
                }
            } else {
                $value = Abstracter::UNDEFINED;
            }
            $values[$key] = $value;
        }
        return $values;
    }
Get values for passed keys

Used by table method

@param array $row     should be array or abstraction
@param array $keys    column keys
@param array $objInfo Will be populated with className and phpDoc
if row is an objects, $objInfo['row'] will be populated
if a value is an object being displayed as a string,
$objInfo['cols'][key] will be populated

@return array