Platformsh\Cli\Console\AdaptiveTable::getMaxColumnWidths PHP Method

getMaxColumnWidths() protected method

protected getMaxColumnWidths ( ) : array
return array An array of the maximum column widths that fit into the table width, keyed by the column number.
    protected function getMaxColumnWidths()
    {
        // Loop through the table rows and headers, building multidimensional
        // arrays of the 'original' and 'minimum' column widths. In the same
        // loop, build a count of the number of columns.
        $originalColumnWidths = [];
        $minColumnWidths = [];
        $columnCounts = [0];
        foreach (array_merge($this->rowsCopy, $this->headersCopy) as $rowNum => $row) {
            if ($row instanceof TableSeparator) {
                continue;
            }
            $columnCount = 0;
            foreach ($row as $column => $cell) {
                $columnCount += $column instanceof TableCell ? $column->getColspan() - 1 : 1;
                // The column width is the width of the widest cell.
                $cellWidth = $this->getCellWidth($cell);
                if (!isset($originalColumnWidths[$column]) || $originalColumnWidths[$column] < $cellWidth) {
                    $originalColumnWidths[$column] = $cellWidth;
                }
                // Find the minimum width of the cell. The default is configured
                // in minColumnWidth, but this is overridden for non-wrapping
                // cells and very narrow cells. Additionally, table headers are
                // never wrapped.
                $minCellWidth = $this->minColumnWidth;
                if ($cellWidth < $this->minColumnWidth || $cell instanceof AdaptiveTableCell && !$cell->canWrap() || !isset($this->rowsCopy[$rowNum])) {
                    $minCellWidth = $cellWidth;
                }
                // The minimum column width is the greatest minimum cell width.
                if (!isset($minColumnWidths[$column]) || $minColumnWidths[$column] < $minCellWidth) {
                    $minColumnWidths[$column] = $minCellWidth;
                }
            }
            $columnCounts[] = $columnCount;
        }
        // Find the number of columns in the table. This uses the same process
        // as the parent private method Table->calculateNumberOfColumns().
        $columnCount = max($columnCounts);
        // Find the maximum width for each column's content, to fit into the
        // calculated maximum content width.
        $maxContentWidth = $this->getMaxContentWidth($columnCount);
        $maxColumnWidths = [];
        $totalWidth = array_sum($originalColumnWidths);
        asort($originalColumnWidths, SORT_NUMERIC);
        foreach ($originalColumnWidths as $column => $columnWidth) {
            $columnRatio = $maxContentWidth / $totalWidth * $columnWidth;
            $maxColumnWidth = round($columnRatio);
            // Do not change the width of columns which are already narrower
            // than the minimum.
            if (isset($minColumnWidths[$column]) && $maxColumnWidth < $minColumnWidths[$column]) {
                $maxColumnWidth = $minColumnWidths[$column];
            }
            $maxColumnWidths[$column] = $maxColumnWidth;
            $totalWidth -= $columnWidth;
            $maxContentWidth -= $maxColumnWidth;
        }
        return $maxColumnWidths;
    }