【问题标题】:Formatting “version” array strings according to max len根据 max len 格式化“版本”数组字符串
【发布时间】: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

标签: php arrays regex string


【解决方案1】:

你可以简化你已经做过的所有事情:

首先我们可以将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);

?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多