PHP : 将一个数组插入另一个数组
PHP : Insert an array into another array
我正在尝试标准化一串以逗号分隔的数字,以及一个范围。演示:
数组:
$array = ["1","2","5-10","15-20"];
应该变成:
$array = [1,2,5,6,7,8,9,10,15,16,17,18,19,20];
我正在研究的算法是:
//get the array values with a range in it :
$rangeArray = preg_grep('[-]',$array);
这将包含 ["5-10", "16-20"];
然后:
foreach($rangeArray as $index=>$value){
$rangeVal = explode('-',$value);
$convertedArray = range($rangeVal[0],$rangeVal[1]);
}
转换后的数组现在将包含 ["5","6","7","8","9","10"];
我现在面临的问题是,如何弹出原始数组中的值“5-10”,并将值插入$convertedArray,所以我将拥有以下价值:
$array = ["1","2","5","6","7","8","9","10","16-20"];
那么,如何将一个数组插入到一个数组中呢?还是有更清洁的方法来解决此类问题?将数字和范围值的数组转换为正确排序的数字的数组?
更简单、更简短的答案。
$new_array = array();
foreach($array as $number){
if(strpos($number,'-')){
$range = explode('-', $number);
$new_array = array_merge($new_array, range($range[0],$range[1]));
}
else{
$new_array[] = (int) $number;
}
}
var_dump($new_array);
使用范围和array_merge处理非数值:
$array = ["1","2","5-10","15-20"];
$newArray = [];
array_walk(
$array,
function($value) use (&$newArray) {
if (is_numeric($value)) {
$newArray[] = intval($value);
} else {
$newArray = array_merge(
$newArray,
call_user_func_array('range', explode('-', $value))
);
}
}
);
var_dump($newArray);
给你。
我尽量减少代码。
考虑下面的初始数组,
$array = ["1","2","5-10","15-20"];
如果您想用它创建一个新数组 $array
,请在 $array
第一次出现的下方更改为您想要的任何名称,
$array = call_user_func_array('array_merge', array_map(function($value) {
if(1 == count($explode = explode('-', $value, 2))) {
return [(int)$value];
}
return range((int)$explode[0], (int)$explode[1]);
}, $array));
现在,$array
变成了,
$array = [1,2,5,6,7,8,9,10,15,16,17,18,19,20];
备注:
- 将每个转换后的成员转换为整数
- 如果提供
15-20-25
,则考虑15-20
并忽略其余
- 如果提供
15a-20b
,则视为15-20
,这是用-
分解后的大小写为整数的结果,15a
变为15
- 将数组键转换为从
0
开始的数字升序
- 仅当给定数组按单个成员和范围成员组合的升序排列时,新数组才会排序
试试这个:
<?php
$array = ["1","2","5-10","15-20"];
$newdata = array();
foreach($array as $data){
if(strpos($data,'-')){
$range = explode('-', $data);
for($i=$range[0];$i<=$range[1];$i++){
array_push($newdata, $i);
}
}
else{
array_push($newdata, (int)$data);
}
}
echo "<pre>";
print_r($array);
echo "</pre>";
echo "<pre>";
print_r($newdata);
echo "</pre>";
结果:
Array
(
[0] => 1
[1] => 2
[2] => 5-10
[3] => 15-20
)
Array
(
[0] => 1
[1] => 2
[2] => 5
[3] => 6
[4] => 7
[5] => 8
[6] => 9
[7] => 10
[8] => 15
[9] => 16
[10] => 17
[11] => 18
[12] => 19
[13] => 20
)
问题已解决!
找出最小值和最大值并用它们创建数组更容易。这是一个例子:
$in = ["1","2","5-10","15-20"];
$out = normalizeArray($in);
var_dump($out);
function normalizeArray($in)
{
if(is_array($in) && sizeof($in) != 0)
{
$min = null;
$max = null;
foreach($in as $k => $elem)
{
$vals = explode('-', $elem);
foreach($vals as $i => $val)
{
$val = intval($val);
if($min == null || $val < $min)
{
$min = $val;
}
if($max == null || $val > $max)
{
$max = $val;
}
}
}
$out = array();
for($i = $min; $i <= $max; $i++)
{
$out[] = $i;
}
return $out;
}
else
{
return array();
}
}
试试这个:
$array = ["1","2","5-10","15-20"];
$result = [];
foreach ($array as $a) {
if (strpos($a,"-")!== false){
$tmp = explode("-",$a);
for ($i = $tmp[0]; $i<= $tmp[1]; $i++) $result[] = $i;
} else {
$result[] = $a;
}
}
var_dump($result);
你有点没说完
$array = ["1","2","5-10","15-20"];
// need to reverse order else index will be incorrect after inserting
$rangeArray = array_reverse( preg_grep('[-]',$array), true);
$convertedArray = $array;
foreach($rangeArray as $index=>$value) {
$rangeVal = explode('-',$value);
array_splice($convertedArray, $index, 1, range($rangeVal[0],$rangeVal[1]));
}
print_r($convertedArray);
给你伙计。
<?php
$array = ["1","2","5-10","15-20"];
$newArr = array();
foreach($array as $item){
if(strpos($item, "-")){
$temp = explode("-", $item);
$first = (int) $temp[0];
$last = (int) $temp[1];
for($i = $first; $i<=$last; $i++){
array_push($newArr, $i);
}
}
else
array_push($newArr, $item);
}
print_r($newArr);
?>
我正在尝试标准化一串以逗号分隔的数字,以及一个范围。演示:
数组:
$array = ["1","2","5-10","15-20"];
应该变成:
$array = [1,2,5,6,7,8,9,10,15,16,17,18,19,20];
我正在研究的算法是:
//get the array values with a range in it :
$rangeArray = preg_grep('[-]',$array);
这将包含 ["5-10", "16-20"];
然后:
foreach($rangeArray as $index=>$value){
$rangeVal = explode('-',$value);
$convertedArray = range($rangeVal[0],$rangeVal[1]);
}
转换后的数组现在将包含 ["5","6","7","8","9","10"];
我现在面临的问题是,如何弹出原始数组中的值“5-10”,并将值插入$convertedArray,所以我将拥有以下价值:
$array = ["1","2","5","6","7","8","9","10","16-20"];
那么,如何将一个数组插入到一个数组中呢?还是有更清洁的方法来解决此类问题?将数字和范围值的数组转换为正确排序的数字的数组?
更简单、更简短的答案。
$new_array = array();
foreach($array as $number){
if(strpos($number,'-')){
$range = explode('-', $number);
$new_array = array_merge($new_array, range($range[0],$range[1]));
}
else{
$new_array[] = (int) $number;
}
}
var_dump($new_array);
使用范围和array_merge处理非数值:
$array = ["1","2","5-10","15-20"];
$newArray = [];
array_walk(
$array,
function($value) use (&$newArray) {
if (is_numeric($value)) {
$newArray[] = intval($value);
} else {
$newArray = array_merge(
$newArray,
call_user_func_array('range', explode('-', $value))
);
}
}
);
var_dump($newArray);
给你。 我尽量减少代码。
考虑下面的初始数组,
$array = ["1","2","5-10","15-20"];
如果您想用它创建一个新数组 $array
,请在 $array
第一次出现的下方更改为您想要的任何名称,
$array = call_user_func_array('array_merge', array_map(function($value) {
if(1 == count($explode = explode('-', $value, 2))) {
return [(int)$value];
}
return range((int)$explode[0], (int)$explode[1]);
}, $array));
现在,$array
变成了,
$array = [1,2,5,6,7,8,9,10,15,16,17,18,19,20];
备注:
- 将每个转换后的成员转换为整数
- 如果提供
15-20-25
,则考虑15-20
并忽略其余 - 如果提供
15a-20b
,则视为15-20
,这是用-
分解后的大小写为整数的结果,15a
变为15
- 将数组键转换为从
0
开始的数字升序
- 仅当给定数组按单个成员和范围成员组合的升序排列时,新数组才会排序
试试这个:
<?php
$array = ["1","2","5-10","15-20"];
$newdata = array();
foreach($array as $data){
if(strpos($data,'-')){
$range = explode('-', $data);
for($i=$range[0];$i<=$range[1];$i++){
array_push($newdata, $i);
}
}
else{
array_push($newdata, (int)$data);
}
}
echo "<pre>";
print_r($array);
echo "</pre>";
echo "<pre>";
print_r($newdata);
echo "</pre>";
结果:
Array
(
[0] => 1
[1] => 2
[2] => 5-10
[3] => 15-20
)
Array
(
[0] => 1
[1] => 2
[2] => 5
[3] => 6
[4] => 7
[5] => 8
[6] => 9
[7] => 10
[8] => 15
[9] => 16
[10] => 17
[11] => 18
[12] => 19
[13] => 20
)
问题已解决!
找出最小值和最大值并用它们创建数组更容易。这是一个例子:
$in = ["1","2","5-10","15-20"];
$out = normalizeArray($in);
var_dump($out);
function normalizeArray($in)
{
if(is_array($in) && sizeof($in) != 0)
{
$min = null;
$max = null;
foreach($in as $k => $elem)
{
$vals = explode('-', $elem);
foreach($vals as $i => $val)
{
$val = intval($val);
if($min == null || $val < $min)
{
$min = $val;
}
if($max == null || $val > $max)
{
$max = $val;
}
}
}
$out = array();
for($i = $min; $i <= $max; $i++)
{
$out[] = $i;
}
return $out;
}
else
{
return array();
}
}
试试这个:
$array = ["1","2","5-10","15-20"];
$result = [];
foreach ($array as $a) {
if (strpos($a,"-")!== false){
$tmp = explode("-",$a);
for ($i = $tmp[0]; $i<= $tmp[1]; $i++) $result[] = $i;
} else {
$result[] = $a;
}
}
var_dump($result);
你有点没说完
$array = ["1","2","5-10","15-20"];
// need to reverse order else index will be incorrect after inserting
$rangeArray = array_reverse( preg_grep('[-]',$array), true);
$convertedArray = $array;
foreach($rangeArray as $index=>$value) {
$rangeVal = explode('-',$value);
array_splice($convertedArray, $index, 1, range($rangeVal[0],$rangeVal[1]));
}
print_r($convertedArray);
给你伙计。
<?php
$array = ["1","2","5-10","15-20"];
$newArr = array();
foreach($array as $item){
if(strpos($item, "-")){
$temp = explode("-", $item);
$first = (int) $temp[0];
$last = (int) $temp[1];
for($i = $first; $i<=$last; $i++){
array_push($newArr, $i);
}
}
else
array_push($newArr, $item);
}
print_r($newArr);
?>