设,有数组:
$arr = [3, 1, 2, 4, 8, 7, 9, 10, 13, 15];
写一个函数,使其输出格式为:
$arr = array(
0 => '1~4',
1 => '7~10',
2 => '13',
3 => '15'
);
补充:
感谢已经回答的各位道友!
数组$arr的长度是不固定的,内容也是动态的,仅已知这个数组是一维数组,数组键值也可能是个字符串类型!
补充:再次谢谢诸位道友! 我也琢磨了个函数,分享一下,望批评!
$arr = [3, 1, 2, 4, 7, 8, 9, 10, 13, 15, 15, 'sdfsf'];
function foo($arr)
{
asort($arr);
$cur = 0;
$list = [];
foreach ($arr as $k => $v){
//如果不是数值或者是空则剔除此元素,进入下个循环
if(!is_numeric($v) || empty($v)) {
unset($arr[$k]);
continue;
}
//如果连续中的末尾数值和当前数值相差为1,则继续压入该连续段$list[$cur],否则建立下个连续段
if(!empty($list[$cur]) && ($v - end($list[$cur]) > 1)){
$cur++;
}
//如果连续段中已经存在该值则进入下一循环
elseif(!empty($list[$cur]) && in_array($v, $list[$cur])){
continue;
}
//压入
$list[$cur][] = $v;
}
//把压好的数组进行格式化(变成 a~b )样式
foreach ($list as $k => $v){
//保险起见 再排个序
asort($v);
//如果数组中不止一个元素
if(count($v) > 1){
$list[$k] = $v[0]. '~'. end($v);
}
else{
$list[$k] = $v[0];
}
}
return $list;
}
echo '<pre>';
var_export(foo($arr));
打印结果:
array (
0 => '1~4',
1 => '7~10',
2 => 13,
3 => 15,
)
看到这个问题,自己实现了哈,不是很优化,供参考
结果 :