在 PHP 中使用具有匹配表达式的值数组
Using an Array of values with a Match Expression in PHP
有没有一种方法可以使用数组作为值列表来匹配 PHP 中的 match
表达式?
考虑一下:
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
};
虽然上述方法有效,但我想以更 readable/manageable 的方式格式化匹配语句。例如,我在我的数据转换器上使用上面的表达式来在我的 API 中呈现数据;因此,我发现自己处于以一种格式返回许多字段的情况,并且以以下方式(或类似方式)呈现它会明显更具可读性:
$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
};
你的问题启发我检查 ...$string_columns
是否适用于 match
语句,但它不适用。
除了技巧,我认为 match
没有任何方法可以做到这一点。
我想到的一个技巧是为 return 值创建一个辅助函数,仅当它在数组中时:
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
};
有点冗长,但可以。
我认为值得将match
理解为一种只适合特定场景的语言结构。
这是不可能的。只需在默认值中添加 in_array。
return match ($field) {
'image' => $item->{$field}->getUrls(),
'balance' => (int) $item->{$field},
default => in_array($value, $string_columns, true) ?
(string) $item->{$field}
: null;
};
如果数组比较多,可以链式三元运算符
有没有一种方法可以使用数组作为值列表来匹配 PHP 中的 match
表达式?
考虑一下:
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
};
虽然上述方法有效,但我想以更 readable/manageable 的方式格式化匹配语句。例如,我在我的数据转换器上使用上面的表达式来在我的 API 中呈现数据;因此,我发现自己处于以一种格式返回许多字段的情况,并且以以下方式(或类似方式)呈现它会明显更具可读性:
$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
};
你的问题启发我检查 ...$string_columns
是否适用于 match
语句,但它不适用。
除了技巧,我认为 match
没有任何方法可以做到这一点。
我想到的一个技巧是为 return 值创建一个辅助函数,仅当它在数组中时:
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
};
有点冗长,但可以。
我认为值得将match
理解为一种只适合特定场景的语言结构。
这是不可能的。只需在默认值中添加 in_array。
return match ($field) {
'image' => $item->{$field}->getUrls(),
'balance' => (int) $item->{$field},
default => in_array($value, $string_columns, true) ?
(string) $item->{$field}
: null;
};
如果数组比较多,可以链式三元运算符