3v4l.org

run code in 300+ PHP versions simultaneously
<?php function array_transpose(array|object $object_or_array): array|object { $levelOneType = gettype($object_or_array); if (!in_array($levelOneType, ['array', 'object'])) { throw new Exception("Fatal error: Uncaught TypeError: array_transpose(): Argument #1 ($object_or_array) must be of type object|array, $levelOneType given"); } foreach ($object_or_array as $rowKey => $row) { $levelTwoType = gettype($row); if (!in_array($levelTwoType, ['array', 'object'])) { throw new Exception("Fatal error: Uncaught TypeError: array_transpose(): Argument #1 ($object_or_array) must contain rows of type object|array, $levelTwoType given"); } $result ??= ($levelTwoType === 'array' ? [] : (object)[]); foreach ($row as $columnKey => $value) { if ($levelTwoType === 'array') { if ($levelOneType === 'array') { $result[$columnKey][$rowKey] = $value; } else { $result[$columnKey]->$rowKey = $value; } } else { if (!property_exists($result, $columnKey)) { $result->$columnKey = ($levelOneType === 'array' ? [] : (object)[]); } if ($levelOneType === 'array') { $result->{$columnKey}[$rowKey] = $value; } else { $result->{$columnKey}->$rowKey = $value; } } } } return $result ?? ($levelOneType === 'array' ? [] : (object)[]); } $tests = [ [], (object)[], [['single' => 'row']], ['a' => [1], 'b' => [2, 3]], [['id' => 1], ['id' => 2]], [(object)['x' => 1, 'y' => [[2]]], (object)['a' => null, 'b' => "3"]], (object)['foo' => (object)['bar' => 42], 'goo' => (object)['car' => 24]], [[], []], [[], [], [false]], [[[]], [[]]], ]; foreach ($tests as $test) { echo var_export(array_transpose($test), true) . "\n---\n"; }

preferences:
25.22 ms | 405 KiB | 5 Q