根据max len格式化“版本”数组字符串

时间:2016-04-03 23:51:33

标签: php arrays regex string

我有这个数组:

$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 );

有人有任何想法简化这个过程吗?

1 个答案:

答案 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);

?>