Как очистить пустые значения после последнего значения в массиве - PullRequest
0 голосов
/ 22 января 2019

У меня есть следующий массив, и я пытаюсь добиться того, чтобы удалить все null значения после i значения.

Исходный массив:

$a = ["a", "b", null, null, null, null, "i", null, null, null, null];

Желаемыйрезультат:

$a = ["a", "b", null, null, null, null, "i"];

Вещи, которые я пробовал: Итак, у меня была идея отфильтровать массив из пустых значений с помощью array_filter, получить индекс последнего значения, а затем получить индекс последнего элемента в исходном массиве.и сбросьте этот диапазон, используя для цикла, но это не кажется мне эффективным решением.Итак, мой вопрос: есть ли другие, более эффективные способы достижения этого?Спасибо.

Ответы [ 5 ]

0 голосов
/ 22 января 2019
$found = false;
$item = "i";
$a = ["a", "b", null, null, null, null, "i", null, null, null, null];
print_r(array_filter($a, function($value) { 
  if($value == $item) {
    $found = true;
  }
  return !$found || !is_null($value) 
}));

По сути, мы начинаем проверять нулевые значения после того, как нашли наш элемент.

0 голосов
/ 22 января 2019
print_r(array_filter($linksArray, function($value) { return $value !== ''; }));

использовать array_filter () Подробнее

0 голосов
/ 22 января 2019

Метод array_filter() будет работать только в том случае, если все ненулевые значения являются уникальными. Если есть дубликаты, array_search() найдет первый из них, а не последний.

Вы можете использовать цикл for, который идет с конца, пока не найдет ненулевую запись:

for ($i = count($a)-1; $i >= 0 && $a[$i] === null; $i--) {
    unset($a[$i]);
}
0 голосов
/ 22 января 2019

Просто используйте array_filter функцию:

$result = array_filter($arr, function($v, $k) use($arr) {
    $iKey = array_search('i', $arr);
    if(($iKey >= $k) || ($iKey < $k && !$v))
        return $v;
}, ARRAY_FILTER_USE_BOTH)

Как уже упоминалось в комментарии, если i может быть чем угодно, вы можете просто сделать следующий однострочный;):

var_dump(array_slice($arr, 0, array_search(end(array_filter($arr)),$arr)+1));
0 голосов
/ 22 января 2019

array_pop() позволяет захватывать элементы с конца массива;вы можете продолжать делать это, пока не найдете элемент не-null или массив не будет пустым.

// This version modifies the array in-place
function remove_trailing_nulls(&$arr) {
  while($arr) {
    $last = array_pop($arr);
    if($last !== null) {
      // Re-add the non-null element that was removed, and we're done
      $arr[] = $last;
      return;
    }
  }
}

// This version returns a new copy of the array
function without_trailing_nulls($arr) {
  while($arr) {
    $last = array_pop($arr);
    if($last !== null) {
      // Re-add the non-null element that was removed, and we're done
      $arr[] = $last;
      break;
    }
  }
  return $arr;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...