У меня есть строка (обрезанная), и я хотел бы разделить эту строку в соответствии с предопределенным шаблоном. Я написал код, который, вероятно, более понятен.

    $string="123456789";
    $format=['XXX','XX','XXXX'];
    $formatted="";
    foreach ($format as $cluster){
        $formattedCluster=substr($string,0,strlen($cluster));
        $string=substr($string,strlen($cluster));
        $formatted.=$formattedCluster.' ';
    }
    $formatted=substr($formatted, 0, -1);

    dd($formatted);

    //outputs: "123 45 6789"

Как вы можете видеть, он берет строку без пробелов и разделяет ее пробелами в соответствии с шаблоном $format в этом случае. Паттерн - это массив.

Псевдо-пример:

$str='qweasdzxc'

$pattern=['X','X','XXXX','XXX']

$formatted='q w easd zxc'; //expected output

Это работает, как и ожидалось, но довольно отвратительно. Какое правильное решение этой проблемы? Под корректностью я подразумеваю скорость и читабельность.

Среда: Php 7.4, Laravel 8

2
Skywarth 14 Окт 2021 в 15:33

3 ответа

Лучший ответ

Я бы использовал https://www.php.net/manual/en/function .vsprintf.php получить результат:

$str='qweasdzxc';
$pattern='% % %%%% %%%'; // ['X','X','XXXX','XXX']
echo vsprintf(str_replace('%', '%s', $pattern), str_split($str));
2
Marco 14 Окт 2021 в 12:47
$string = "qweasdzxc";
$chunks = array(1,1,4,3);
// Optional check to ensure that $string can be divided into requested chunks
if(array_sum($chunks) <> strlen($string)) { 
    echo "String length does not fit requested chunks.";
}
$i=0;
$output = "";
foreach($chunks as $chunk) { 
    $output .= substr($string,$i,$chunk) . " ";
    $i += $chunk;
}

echo rtrim($output);
// Outputs "q w easd zxc"

Вероятно, это более простой способ удалить пробел с правой стороны, не добавляя его в первую очередь в зависимости от того, является ли он последним элементом массива, но это помогает.

1
Giles Bennett 14 Окт 2021 в 12:45

Простой способ использовать preg_match попробуйте это.

$data = '11234567890';

if(preg_match( '/^\d(\d{3})(\d{3})(\d{4})$/', $data,  $matches))
{
    $result = $matches[1] . ' ' .$matches[2] . ' ' . $matches[3];
    echo  $result;
}
1
Robin Hood 14 Окт 2021 в 12:55