PHP:从数组中删除空值并向上移动值

时间:2017-04-27 08:53:00

标签: php arrays coding-efficiency

我正在尝试创建一个函数,如果前一个键为空且后一个键设置,则将数组值向上移动一个键。例如。这个数组:

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%确定它可以更有效地完成,有关如何有效实现的任何想法?

由于

4 个答案:

答案 0 :(得分:4)

您可以使用array_函数在一行中执行此操作。

$o = array_combine(array_keys($input), array_pad(array_filter($input), count($input), ''));
    默认情况下,
  • array_filter将从数组中删除所有空值
  • array_pad将数组填充到原始数组的长度,添加空字符串
  • array_keys将获取原始数组的键
  • 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

答案 1 :(得分:1)

让我们用一个大阵列试试这个,希望这会帮助你。问题的方式不同,但你的问题与

相同

<强> 1。最后得到空值。

<强> 2。开始时非空,不改变订单

第3。无需更改按键顺序

如果您考虑任何阵列,这个结果就会结束。

Try this code snippet here

<?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] => 
)

答案 2 :(得分:0)

  • 很遗憾你没有分享你的代码,所以我们无法确切知道你做了什么
  • 如果您将数组添加为我们可以直接运行的代码并且不需要编辑/重新创建
  • 也会很有帮助

我会

  • 在可能的情况下忽略处理列表的键
  • unset条目不再需要
  • 使用foreach
  • 迭代列表

除此之外,你可以用PHP对列表进行排序(按值,键; asc,desc;有/无关联),它们在手册中有一个很好的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 ) );

?>

答案 3 :(得分:0)

修改

 $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);

<强> OUTUT

     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)