<?php
function array_transpose_basic(array|object $object_or_array): array|object {
$levelOneType = gettype($object_or_array);
if (!in_array($levelOneType, ['array', 'object'])) {
throw new Exception("Error: array_transpose() expects parameter 1 to be an array or object, $levelOneType given");
}
$result = [];
foreach ($object_or_array as $rowKey => $row) {
$levelTwoType = gettype($row);
if (!in_array($levelTwoType, ['array', 'object'])) {
throw new Exception("Error: array_transpose() expects parameter 1 to contain rows of arrays or objects, $levelTwoType given");
}
foreach ($row as $columnKey => $value) {
$result[$columnKey][$rowKey] = $value;
}
}
return $result;
}
function array_transpose_types(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)[]);
}
function array_transpose_splat(array|object $object_or_array): array {
if (!is_array($object_or_array)) {
return ["must be array"];
}
if (!$object_or_array) {
return ["must not be empty"];
}
foreach ($object_or_array as $key => $value) {
if (!ctype_digit((string)$key)) {
return ["may only contain numeric first level keys"];
}
if (!is_array($value)) {
return ["may only contain arrays in second level"];
}
}
return array_map(null, ...$object_or_array);
}
$test = (object) [];
echo var_export(array_transpose_basic($test), true) . "\n---\n";
echo var_export(array_transpose_types($test), true) . "\n---\n";
echo var_export(array_transpose_splat($test), true);
preferences:
23.49 ms | 407 KiB | 5 Q