PHP:从数组中删除空值并将值向上移动
PHP: Remove empty values from array and shift values up
我正在尝试创建一个函数,如果前一个键为空且设置了后一个键,则将数组值向上移动一个键。例如。这个数组:
array (size=4)
'row1' => string 'row1' (length=4)
'row2' => string '' (length=0)
'row3' => string '' (length=0)
'row4' => string 'row4' (length=4)
在我的函数调用后应该变成这样:
array (size=4)
'row1' => string 'row1' (length=4)
'row2' => string 'row4' (length=4)
'row3' => string '' (length=0)
'row4' => string '' (length=0)
我确实有一个工作函数,但是,它使用了很多 if 语句,我 100% 确定它可以更有效地完成,关于如何有效实现的任何想法?
谢谢
- 很遗憾,您没有分享您的代码,所以我们无法知道您的具体操作
- 如果您将数组添加为代码也会有帮助,我们可以直接 运行 而不需要 edit/re-create
我愿意
- 尽可能忽略处理列表的键
unset
个不再需要的条目
- 使用
foreach
迭代列表
除此之外,您还可以对 PHP 中的列表进行排序(按值、键;升序、降序;with/without 关联),它们在手册中有很好的 overview .
示例步骤:
<?php
$a['row1'] = 'row1';
$a['row2'] = '';
$a['row3'] = '';
$a['row4'] = 'row4';
print_r( $a );
arsort($a);
print_r( $a );
//get rid of double entries
$f=array_flip( $a );
//get rid of empty entries
unset($f['']);
print_r( array_flip( $f ) );
?>
编辑
$yourarr=array('row1'=>"row1",'row2'=>"",'row3'=>"",'row4'=>"row4");
$array1=array();
$array2=array();
foreach ($yourarr as $key =>$val){
if(empty($val)){
$array2[$key]=$val;
}else{
$array1[$key]=$val;
}
}
$newarr=array_merge($array1,$array2);
//<!-- Try This if you want to remove the empty indexes just put ! infront of the empty and delete the else part and to reset the row count -->
$i=1;
$newarr2=array();
foreach($newarr as $key =>$val){
$newarr2['row'.$i]=$val;
$i++;
}
var_dump($newarr2);
输出
D:\wamp64\www\test\index.php:21:
array (size=4)
'row1' => string 'row1' (length=4)
'row2' => string 'row4' (length=4)
'row3' => string '' (length=0)
'row4' => string '' (length=0)
让我们用一个大数组试试这个,希望这对你有所帮助。提问方式不同,但你的问题是一样的
1.最后获取空值。
2。不改序开始非空
3。不改变按键顺序
如果你考虑任何数组,这个结果就结束了。
<?php
$array=$tempArray=array(
'row1' => 'row1',
'row2' => '' ,
'row3' => '',
'row6' => 'row6' ,
'row4' => 'row4' ,
'row5' => '',
'row7' => 'row7' ,
'row8' => ''
);
$result=array();
$tempArray= array_values($tempArray);
$tempArray=array_values(array_filter($tempArray));
foreach(array_keys($array) as $key_key => $key)
{
if(!empty($tempArray[$key_key]))
{
$result[$key]=$tempArray[$key_key];
}
else
{
$result[$key]="";
}
}
print_r($result);
输出:
Array
(
[row1] => row1
[row2] => row6
[row3] => row4
[row6] => row7
[row4] =>
[row5] =>
[row7] =>
[row8] =>
)
您可以使用 array_
函数在一行中完成此操作。
$o = array_combine(array_keys($input), array_pad(array_filter($input), count($input), ''));
默认情况下,array_filter
将从数组中删除所有空值
array_pad
会将数组填充到原数组的长度,添加一个空字符串
array_keys
会得到原数组的key
array_combine
将结合键和值
以上将输出以下内容:
array (size=4)
'row1' => string 'row1' (length=4)
'row2' => string 'row4' (length=4)
'row3' => string '' (length=0)
'row4' => string '' (length=0)
Here's a demo
我正在尝试创建一个函数,如果前一个键为空且设置了后一个键,则将数组值向上移动一个键。例如。这个数组:
array (size=4)
'row1' => string 'row1' (length=4)
'row2' => string '' (length=0)
'row3' => string '' (length=0)
'row4' => string 'row4' (length=4)
在我的函数调用后应该变成这样:
array (size=4)
'row1' => string 'row1' (length=4)
'row2' => string 'row4' (length=4)
'row3' => string '' (length=0)
'row4' => string '' (length=0)
我确实有一个工作函数,但是,它使用了很多 if 语句,我 100% 确定它可以更有效地完成,关于如何有效实现的任何想法?
谢谢
- 很遗憾,您没有分享您的代码,所以我们无法知道您的具体操作
- 如果您将数组添加为代码也会有帮助,我们可以直接 运行 而不需要 edit/re-create
我愿意
- 尽可能忽略处理列表的键
unset
个不再需要的条目- 使用
foreach
迭代列表
除此之外,您还可以对 PHP 中的列表进行排序(按值、键;升序、降序;with/without 关联),它们在手册中有很好的 overview .
示例步骤:
<?php
$a['row1'] = 'row1';
$a['row2'] = '';
$a['row3'] = '';
$a['row4'] = 'row4';
print_r( $a );
arsort($a);
print_r( $a );
//get rid of double entries
$f=array_flip( $a );
//get rid of empty entries
unset($f['']);
print_r( array_flip( $f ) );
?>
编辑
$yourarr=array('row1'=>"row1",'row2'=>"",'row3'=>"",'row4'=>"row4");
$array1=array();
$array2=array();
foreach ($yourarr as $key =>$val){
if(empty($val)){
$array2[$key]=$val;
}else{
$array1[$key]=$val;
}
}
$newarr=array_merge($array1,$array2);
//<!-- Try This if you want to remove the empty indexes just put ! infront of the empty and delete the else part and to reset the row count -->
$i=1;
$newarr2=array();
foreach($newarr as $key =>$val){
$newarr2['row'.$i]=$val;
$i++;
}
var_dump($newarr2);
输出
D:\wamp64\www\test\index.php:21:
array (size=4)
'row1' => string 'row1' (length=4)
'row2' => string 'row4' (length=4)
'row3' => string '' (length=0)
'row4' => string '' (length=0)
让我们用一个大数组试试这个,希望这对你有所帮助。提问方式不同,但你的问题是一样的
1.最后获取空值。
2。不改序开始非空
3。不改变按键顺序
如果你考虑任何数组,这个结果就结束了。
<?php
$array=$tempArray=array(
'row1' => 'row1',
'row2' => '' ,
'row3' => '',
'row6' => 'row6' ,
'row4' => 'row4' ,
'row5' => '',
'row7' => 'row7' ,
'row8' => ''
);
$result=array();
$tempArray= array_values($tempArray);
$tempArray=array_values(array_filter($tempArray));
foreach(array_keys($array) as $key_key => $key)
{
if(!empty($tempArray[$key_key]))
{
$result[$key]=$tempArray[$key_key];
}
else
{
$result[$key]="";
}
}
print_r($result);
输出:
Array
(
[row1] => row1
[row2] => row6
[row3] => row4
[row6] => row7
[row4] =>
[row5] =>
[row7] =>
[row8] =>
)
您可以使用 array_
函数在一行中完成此操作。
$o = array_combine(array_keys($input), array_pad(array_filter($input), count($input), ''));
-
默认情况下,
array_filter
将从数组中删除所有空值array_pad
会将数组填充到原数组的长度,添加一个空字符串array_keys
会得到原数组的keyarray_combine
将结合键和值
以上将输出以下内容:
array (size=4)
'row1' => string 'row1' (length=4)
'row2' => string 'row4' (length=4)
'row3' => string '' (length=0)
'row4' => string '' (length=0)