Удалить пустые элементы массива

Некоторые элементы в моем массиве являются пустыми строками, основанными на том, что отправил пользователь. Мне нужно удалить эти элементы. У меня есть это:

foreach($linksArray as $link)
{
    if($link == '')
    {
        unset($link);
    }
}
print_r($linksArray);

Но это не работает. $linksArray все еще имеет пустые элементы. Я также пытался сделать это с помощью функции empty(), но результат тот же.

720
задан Peter Mortensen 6 July 2019 в 19:43
поделиться

1 ответ

С этими типами вещей намного лучше быть явным о том, что Вы хотите и не хотите.

Это поможет следующему парню, который не будет пойман врасплох в поведении array_filter() без обратного вызова. Например, я закончил по этому вопросу, потому что я забыл, удаляет ли array_filter() NULL или нет. Я напрасно тратил время, когда я, возможно, просто использовал решение ниже и имел мой ответ.

кроме того, логика является языком angnostic в том смысле, что код может быть скопирован на другой язык, не имея необходимость к под стендом поведение функции php как array_filter, когда никакой обратный вызов не передается.

В моем решении, ясно на взгляд относительно того, что происходит. Удалите условное выражение, чтобы сохранить что-то или добавить новое условие отфильтровать дополнительные значения.

Игнорирование фактическое использование array_filter(), так как я просто передаю его пользовательский обратный вызов - Вы могли идти вперед и извлечь это к его собственной функции, если бы Вы хотели. Я просто использую его в качестве сахара для foreach цикл.

<?php

$xs = [0, 1, 2, 3, "0", "", false, null];

$xs = array_filter($xs, function($x) {
    if ($x === null) { return false; }
    if ($x === false) { return false; }
    if ($x === "") { return false; }
    if ($x === "0") { return false; }
    return true;
});

$xs = array_values($xs); // reindex array   

echo "<pre>";
var_export($xs);

Другое преимущество этого подхода - то, что можно разбить предикаты фильтрации на абстрактную функцию, которая фильтрует единственное значение на массив и сборку до компонуемого решения.

Посмотрите этот пример и встроенные комментарии для вывода.

<?php

/**
 * @param string $valueToFilter
 *
 * @return \Closure A function that expects a 1d array and returns an array
 *                  filtered of values matching $valueToFilter.
 */
function filterValue($valueToFilter)
{
    return function($xs) use ($valueToFilter) {
        return array_filter($xs, function($x) use ($valueToFilter) {
            return $x !== $valueToFilter;
        });
    };
}

// partially applied functions that each expect a 1d array of values
$filterNull = filterValue(null);
$filterFalse = filterValue(false);
$filterZeroString = filterValue("0");
$filterEmptyString = filterValue("");

$xs = [0, 1, 2, 3, null, false, "0", ""];

$xs = $filterNull($xs);        //=> [0, 1, 2, 3, false, "0", ""]
$xs = $filterFalse($xs);       //=> [0, 1, 2, 3, "0", ""]
$xs = $filterZeroString($xs);  //=> [0, 1, 2, 3, ""]
$xs = $filterEmptyString($xs); //=> [0, 1, 2, 3]

echo "<pre>";
var_export($xs); //=> [0, 1, 2, 3]

Теперь можно динамично создать функцию, вызванную filterer() использование pipe(), который применит эти частично прикладные функции для Вас.

<?php

/**
 * Supply between 1..n functions each with an arity of 1 (that is, accepts
 * one and only one argument). Versions prior to php 5.6 do not have the
 * variadic operator `...` and as such require the use of `func_get_args()` to
 * obtain the comma-delimited list of expressions provided via the argument
 * list on function call.
 *
 * Example - Call the function `pipe()` like:
 *
 *   pipe ($addOne, $multiplyByTwo);
 *
 * @return closure
 */
function pipe()
{
    $functions = func_get_args(); // an array of callable functions [$addOne, $multiplyByTwo]
    return function ($initialAccumulator) use ($functions) { // return a function with an arity of 1
        return array_reduce( // chain the supplied `$arg` value through each function in the list of functions
            $functions, // an array of functions to reduce over the supplied `$arg` value
            function ($accumulator, $currFn) { // the reducer (a reducing function)
                return $currFn($accumulator);
            },
            $initialAccumulator
        );
    };
}

/**
 * @param string $valueToFilter
 *
 * @return \Closure A function that expects a 1d array and returns an array
 *                  filtered of values matching $valueToFilter.
 */
function filterValue($valueToFilter)
{
    return function($xs) use ($valueToFilter) {
        return array_filter($xs, function($x) use ($valueToFilter) {
            return $x !== $valueToFilter;
        });
    };
}

$filterer = pipe(
    filterValue(null),
    filterValue(false),
    filterValue("0"),
    filterValue("")
);

$xs = [0, 1, 2, 3, null, false, "0", ""];
$xs = $filterer($xs);

echo "<pre>";
var_export($xs); //=> [0, 1, 2, 3]
0
ответ дан 22 November 2019 в 21:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: