我有一個字串(修剪過的),我想根據預定義的模式拆分這個字串。我寫了一個可能更具解釋性的代碼。
$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
uj5u.com熱心網友回復:
我會使用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));
uj5u.com熱心網友回復:
$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"
可能是一種更簡單的方法,即根據它是否是陣列的最后一個元素而不首先添加它,從而從右側洗掉空格,但這確實有效。
uj5u.com熱心網友回復:
使用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;
}
uj5u.com熱心網友回復:
我認為這不是您所期望的,但是:
function format_number($number) {
$number_size = strlen($number);
if (9 != $number_size) {
return $number;
}
$step = 0;
$formated = '';
foreach (range(0, 9) as $i => $n) {
if (isset($number[$n])) {
switch ($step) {
case 0:
case 1:
case 3:
case 5:
case 6:
case 7:
case 8:
$formated .= $number[$n];
break;
case 2:
case 4:
$formated .= $number[$n] . ' ';
break;
}
$step ;
}
}
return $formated;
}
僅適用于模式 XXX XX XXXX
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/317441.html
下一篇:Laravel-條件with()
