我有这个数组:
$versions = [ '1', '1.0.2.4', '1.1.0', '1.12.547.8' ];
我想要:
$versions = [ '001', '001.000.002.004', '001.001.000', '001.012.547.008' ];
但是,如果我有这个:
$versions = [ '1', '1.12' ];
我想要这个:
$versions = [ '01', '01.12' ];
换句话说,每个字符串块必须具有相同的最大块len。
说明:
我有一个带有可变元素编号的数组。每个元素都是由点分隔的可变数字组的字符串。每个数字组的长度可变。我希望所有数组子组的最大组长度都相同。
在第一个示例中,最大长度为3(547),因此所有最终数组都有3位数(001,000,...)。在第二个示例中,最大长度为2(12),因此所有组都有2位数(01,01,12)。
我的解决方案:
$max = max( array_map( 'strlen', call_user_func_array( 'array_merge', array_map( function( $row ) { return explode( '.', $row ); }, $versions ) ) ) );
foreach( $versions as &$version )
{
$version = preg_replace( '/\d*(\d{'.$max.'})/', '\1', preg_replace( '/(\d+)/', str_repeat( '0', $max ).'\1', $version ) );
}
说明:
$tmp = array_map( function( $row ) { return explode( '.', $row ); }, $versions );
$tmp = call_user_func_array( 'array_merge', $tmp );
$tmp = array_map( 'strlen', $tmp );
$max = max( $tmp );
$tmp = preg_replace( '/(\d+)/', str_repeat( '0', $max ).'\1', $version );
$version = preg_replace( '/\d*(\d{'.$max.'})/', '\1', $tmp );
有人有任何想法简化这个过程吗?
答案 0 :(得分:5)
嗯,你可以简化你已经做过的所有事情:
首先,我们可以将数组implode()
转换为字符串,并将所有数字与preg_match_all()
匹配。
然后获取最长的数字,我们只使用array_map()
并将strlen()
作为回调,并使用max()
获取最长的数字。
然后,当您知道自己的打击垫长度时,可以使用preg_replace_callback()
浏览数组并使用str_pad()
填充数字。
代码:
<?php
$versions = [ '1', '1.0.2.4', '1.1.0', '1.12.547.8' ];
preg_match_all("/\d+/", implode(".", $versions), $m);
$max = max(array_map("strlen", $m[0]));
$new = preg_replace_callback("/(\d+)/", function($m)use($max){
return str_pad($m[1], $max, "0", STR_PAD_LEFT);
}, $versions);
print_r($new);
?>