Outputting tables on the command line is fiddlier than it sounds, requiring some string padding trickery. Here’s a quick-and-dirty function to insta-win!
An interesting quirk of this function is that it’s more difficult to determine the width of each column than to actually output the table, and that’s where the difficulty is really: determining, for each column, the width of the longest piece of content and padding it to account for cell spacing.
It’s not particularly clever though; it has no concept of headers (perhaps just provide the first row in uppercase) and doesn’t handle text wrapping, but for a quick-and-dirty table it does the job!
The Table function
function table($data) { // Find longest string in each column $columns = []; foreach ($data as $row_key => $row) { foreach ($row as $cell_key => $cell) { $length = strlen($cell); if (empty($columns[$cell_key]) || $columns[$cell_key] < $length) { $columns[$cell_key] = $length; } } } // Output table, padding columns $table = ''; foreach ($data as $row_key => $row) { foreach ($row as $cell_key => $cell) $table .= str_pad($cell, $columns[$cell_key]) . ' '; $table .= PHP_EOL; } return $table; }
Usage
To use this function, pass it a multi-array where each sub-array is a row and each sub-array item is a table cell:
echo table([ ['FOO', 'BAR', 'FIZZ', 'BUZZ'], ['Lorem', 'Ipsum', 'Dolor', 'Emit'], ['Antiquated', 'Porcupine', 'Sandwich', 'Man'], ]);
When run in a command prompt, it’ll look something like this:
Why?
I came upon this requirement while building a micro-framework for PHP console apps. I wanted it to have no dependencies so you could just drop a folder into a project and go, but could still use Composer if preferable (a la Slim). The logic was that if you were familiar with Composer you’re probably building something medium-to-large and would need something more kitchen-sink-like such as Synfony Console anyway.
To be honest this is probably one of those “reinventing the wheel” things, but I think it’s good to revisit old problems every once in a while with a perspective that’s fresh and more experienced. The blog CMS I’d make today would be very different from the one I’d have made 2 years ago, so here’s to reinventing the wheel — and telling yourself that your own re-invention is worthy of remark :)