PHP: удалить пустые значения из массива и сдвинуть значения вверх

Я пытаюсь создать функцию, которая сдвигает значения массива на ключ, если предыдущий ключ пуст и задан один после. Например. этот массив:

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% уверен, что это можно сделать более эффективно, есть идеи, как добиться этого эффективно?

Спасибо

1

Решение

Давайте попробуем это с большим массивом и надеемся, что это вам поможет. Другой вопрос, но ваш вопрос такой же, как

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

Другие решения

Вы можете сделать это в одну строку, используя 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)

Вот демо

4

  • к сожалению, вы не поделились своим кодом, поэтому мы не можем точно знать, что вы делаете
  • также было бы полезно, если бы вы добавили массив в виде кода, который мы можем запустить напрямую и не нужно редактировать / заново создавать

я мог бы

  • игнорируйте ключи для обработки списка, когда это возможно
  • unset записи, которые больше не нужны
  • повторять списки с foreach

кроме этого вы можете сортировать списки в PHP (по значению, ключу; asc, desc; с / без ассоциации), у них есть хорошая обзор об этом в руководстве.

пример шагов:

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

?>
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)
0