¿Hay alguna manera de usar una matriz como una lista de valores para comparar en una expresión de match en PHP?
Considera esto:
return match ($field) { 'id', 'first_name', 'last_name', 'updated_at', 'created_at' => (string) $item->{$field}, 'image' => $item->{$field}->getUrls(), 'balance' => (int) $item->{$field}, default => null };Si bien lo anterior funciona, me gustaría formatear la declaración de coincidencia de una manera más legible/manejable. Por ejemplo, uso la expresión anterior en mis transformadores de datos para presentar datos en mis API; como tal, puedo encontrarme en situaciones en las que se devuelven muchos campos en un formato, y sería significativamente más legible presentarlo de la siguiente manera (o algo similar):
$string_columns = ['id', 'first_name', 'last_name', 'updated_at', 'created_at']; return match ($field) { $string_columns => (string) $item->{$field}, 'image' => $item->{$field}->getUrls(), 'balance' => (int) $item->{$field}, default => null };Su pregunta me inspiró a verificar si ...$string_columns funcionaría para la declaración de match , pero no es así.
No creo que haya ninguna forma de hacerlo con match , aparte de los trucos.
Un truco que pensé fue crear una función auxiliar para devolver el valor solo si está en la matriz:
function any(array $values, $value) { return in_array($value, $values, true) ? $value : null; } $string_columns = ['id', 'first_name', 'last_name', 'updated_at', 'created_at']; return match ($field) { any($string_columns, $field) => (string) $item->{$field}, 'image' => $item->{$field}->getUrls(), 'balance' => (int) $item->{$field}, default => null };Un poco detallado, pero funcionaría.
Creo que vale la pena entender la match como una construcción del lenguaje que se adapta solo a ciertos escenarios.
No es posible. Simplemente agregue in_array en el valor predeterminado.
return match ($field) { 'image' => $item->{$field}->getUrls(), 'balance' => (int) $item->{$field}, default => in_array($value, $string_columns, true) ? (string) $item->{$field} : null; };Si habrá más matrices, puede encadenar el operador ternario