12赞
192
当前位置:  开发笔记 > 编程语言 > 正文

根据maxlen格式化"版本"数组字符串

如何解决《根据maxlen格式化"版本"数组字符串》经验,为你挑选了1个好方法。

我有这个数组:

$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的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> Rizier123..:

那么你可以简化你已经做过的一切:

首先,我们可以implode()将数组转换为字符串并匹配所有数字preg_match_all().

为了再拿到我们只使用最长号码array_map()strlen()回调并获得最长的号码max().

然后,当你知道你的垫长度时,你可以通过你的阵列preg_replace_callback()和填充你的数字str_pad().

码:



推荐阅读
author-avatar
郁小草__
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有