Php 如何将数字数组折叠成一系列范围
我有以下数组:Php 如何将数字数组折叠成一系列范围,php,arrays,Php,Arrays,我有以下数组: $values=array(2000,2001,2002,3000,3001,3002); 我想返回一组数字范围: $ranges=array(2000-2002,3000-3002); 如何做到这一点?我认为使用阵列可能会有更好的解决方案。。。map/reduce/walk函数,但您可以从这个函数开始 $values = [2000, 2001, 2002, 3000, 3001, 3002]; sort($values); $result = []; $start =
$values=array(2000,2001,2002,3000,3001,3002);
我想返回一组数字范围:
$ranges=array(2000-2002,3000-3002);
如何做到这一点?我认为使用阵列可能会有更好的解决方案。。。map/reduce/walk函数,但您可以从这个函数开始
$values = [2000, 2001, 2002, 3000, 3001, 3002];
sort($values);
$result = [];
$start = $prevValue = null;
foreach ($values as value) {
if ($value - $prevValue > 1) {
if ($start) {
$result[] = $start == $prevValue ? $start : $start . '-' . $prevValue;
}
$start = $value;
}
$prevValue = $value;
}
$result[] = $start == $prevValue ? $start : $start . '-' . $prevValue;
测试数据输出:
[2000,2001,2002,3000,3001,3002] => [2000-2002,3000-3002]
[2000,2001,2002,3000,3001,3002,4000] => [2000-2002,3000-3002,4000]
[] => []
[2000] => [2000]
[4001,2000] => [2000,4001]
[4001,2000,2000] => [2000,4001]
给你:
<?php
function groupArrayHelper(array $values, array $groupArray, callable $isWithinRange) {
if ( !$values ) {
return $groupArray;
}
$lastValueInGroup = (string)$values[0];
$group = [ $lastValueInGroup ];
$length = sizeof( $values );
for ( $i = 1; $i < $length; $i++ ) {
$currentValue = $values[$i];
if ( !$isWithinRange( $currentValue, $lastValueInGroup ) ) {
break;
}
$lastValueInGroup = $currentValue;
}
if ( ( $lastValueInGroup - $values[0] ) > 0 ) {
$group[] = (string)$lastValueInGroup;
}
$groupArray[] = implode( $group, '-' );
$moreValues = array_slice( $values, $i );
return groupArrayHelper( $moreValues, $groupArray, $isWithinRange );
}
function groupArray(array $values) {
$values = array_unique( $values );
sort( $values );
return groupArrayHelper(
$values,
[ ],
function ($x, $y) {
return ( 1 == $x - $y );
}
);
}
function formatArray(array $values) {
return sprintf( '[%s]', implode( ',', $values ) );
}
$testValues[] = array( 2000, 2001, 2002, 3000, 3001, 3002 );
$testValues[] = array( 2000, 2001, 2002, 3000, 3001, 3002, 4000 );
$testValues[] = array();
$testValues[] = array( 2000 );
$testValues[] = array( 4001, 2000 );
$testValues[] = array( 4001, 2000, 2000 );
array_map( function ($values) {
$output = groupArray( $values );
echo formatArray( $values ) . ' => ' . formatArray( $output ) . PHP_EOL;
}, $testValues );
您的意思是作为字符串范围$ranges=array(“2000-2002”、“3000-3002”)代码>?是的,作为字符串范围。只有当$values
数组按升序排序时,您的代码才能工作,这使代码更加出色:)好吧,我的代码适用于给定的任务。不幸的是,作者没有向我们提供很多细节,拒绝回答任何问题。另外,我认为对于未排序的数组,我们必须首先对其进行排序。。。