【发布时间】:2016-04-03 23:51:32
【问题描述】:
我有这个数组:
$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' ];
换句话说,每个字符串块的长度必须与最大块长度相同。
解释:
我有一个带有可变元素编号的数组。每个元素都是一串由点分隔的可变数字组。每个数字组具有可变长度。我希望所有数组子组都具有相同的最大组长度。
在第一个示例中,最大长度为 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 );
有人有任何简化流程的想法吗?
【问题讨论】:
-
您的数组是否只包含数字和点?你可以不用正则表达式,使用格式化的字符串。
-
分隔符只有点。子组字母数字。
-
字母数字?你的意思是你可以有
1.1.0a?