在 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;
};

如果数组比较多,可以链式三元运算符