Очистка комбинированного РНР массива от пустых элементов

archive view archive save

Очистка комбинированного РНР массива от пустых элементов Бывает необходимо очистить РНР массив от пустых элементов для того чтобы впустую не тратить время на обработку этих пустых элементов! Эта задача не является сложной когда нужно отфильтровать обычный, не многомерный массив но, она усложняется когда нужна очистка от пустых элементов комбинированного РНР массива.

Например мы открыли файл и поместили все его строки в РНР массив и оставили в нём только уникальные значения при помощи РНР функций:

<?php 
$proxyListArray = array_unique(file($proxyListFile));

Если в файле "$proxyListFile" было с десяток пустых строк, то после его открытия в нём остались как минимум одна пустая строка, а если были строки с разным количеством пробелов, то и они зависнут в результате "$proxyListArray".

Самый простой способ очистки РНР массива от пустых элементов это:

<?php 
$proxyListArray = array_diff($proxyListArray, array(''));

Но он может не подойти из-за наличия пробелов в элементах, мало тога - нам бы желательно сохранить порядковые номера РНР массива 1,2,3,4, а не 1,3,4. В таком случае можно предложить конструкцию:

<?php 
function cleanArray($array)
{
    // Находим в массиве пустые значения
    for($i = 0; $i < count($array); $i++)
    {
        if(trim($array[$i]) == '')
        {
            // если нумерованный, с сохранением порядковых номеров
            array_splice($array, $i, 1);
        }
    }
    return $array;
    // END "cleanArray" FUNCTION
}

или

<?php 
function cleanArray($array)
{
    $result = array();
    foreach ($array as $key => $val) {
            if ($val != '')
        $result[] = $val;
    }
    return $result;
    // END "cleanArray" FUNCTION
}

Но, такая РНР конструкция далека от совершенства и не подойдёт для очистки ассоциативных или многомерных массивов! К примеру у нас имеется такой вот беспредельно комбинированный, чумачечий массив, он же простой (нумерованный), он же ассоциативный, он же многомерный/вложенный массив:

<?php 
$myArray = array(
    '0' => array('Yacht0', 'Liner0', 'Ferry0'),
    '1' => '',
    '2345',
    '',
    'jgygj' => '',
    array(
        array( 'value1', 'value2', '0' ),
        array( 'value3', 'value4', '' )
    ),
    array(
        array( 'value5', 'value6', '0'),
        array( 'value7', 'value8', 'value9', 'assArr1' => 'assVal1', 
            'assArr2' => 'assVal2', 'assArr3' => '', '0'
        ),
        'Files' => array('file1', '', 'file3'),
        'Files2' => array('file12', '', 'file32', '', 'file42')
    ),
    'Filess' => array('file1', '', 'file3'),
    'Filess2' => array('file12', '', 'file32', '', 'file42')
);
 
echo "<pre>";
print_r($myArray);
echo "</pre>";

Выглядеть всё это безобразие будет следующим образом:

Array
(
    [0] => Array
        (
            [0] => Yacht0
            [1] => Liner0
            [2] => Ferry0
        )
 
    [1] => 
    [2] => 2345
    [3] => 
    [jgygj] => 
    [4] => Array
        (
            [0] => Array
                (
                    [0] => value1
                    [1] => value2
                    [2] => 0
                )
 
            [1] => Array
                (
                    [0] => value3
                    [1] => value4
                    [2] => 
                )
 
        )
 
    [5] => Array
        (
            [0] => Array
                (
                    [0] => value5
                    [1] => value6
                    [2] => 0
                )
 
            [1] => Array
                (
                    [0] => value7
                    [1] => value8
                    [2] => value9
                    [assArr1] => assVal1
                    [assArr2] => assVal2
                    [assArr3] => 
                    [3] => 0
                )
 
            [Files] => Array
                (
                    [0] => file1
                    [1] => 
                    [2] => file3
                )
 
            [Files2] => Array
                (
                    [0] => file12
                    [1] => 
                    [2] => file32
                    [3] => 
                    [4] => file42
                )
 
        )
 
    [Filess] => Array
        (
            [0] => file1
            [1] => 
            [2] => file3
        )
 
    [Filess2] => Array
        (
            [0] => file12
            [1] => 
            [2] => file32
            [3] => 
            [4] => file42
        )
)

Из всего этого беспредела нам нужно удалить пустые элементы РНР массива и при этом сохранить порядок нумерации элементов РНР массива 1,2,3,4, а не 1,3,4 в случае удаления одного из элементов. Для обработки такого чумачечего массива нам соответственно нужна такая же чумачечая функция, приведённую выше РНР функцию модифицируем до такой кондиции:

<?php 
// Функция проверяет является ли присланное значение массивом и если да, то
// возвращает нумерованный массив с именами элементов
function checkArray($array)
{
    // Элемент может быть не цыфра, возможно ассоциативный
    if(is_array($array))
    {
        // получаем нумерованный список элементов с их именами
        return array_keys($array);
    }
    else
    {
        return false;
    }
}
// Фукция очистки массива от пустых элементов до 3-го уровня вложенности
function cleanArray($array)
{
    for($fi = 0; $fi < count($array); $fi++)
    {
        // После каждого прохода список с именами элементов главного массива может 
        // изменятся всвязи с возможным удалением элемента после каждого прохода
        $a = checkArray($array);
        for($fi1 = 0; $fi1 < count($a); $fi1++)
        {
            // Перепроверяем массив со списком именов элементов
            $a = checkArray($array);
 
            // Если элемент массив
            if(is_array($array[$a[$fi1]]))
            {
                // запрашиваем нумерованный список его элементов
                $a1 = checkArray($array[$a[$fi1]]);
                for($fi2 = 0; $fi2 < count($a1); $fi2++)
                {
                    if(is_array($array[$a[$fi1]][$a1[$fi2]]))
                    {
                        $a2 = checkArray($array[$a[$fi1]][$a1[$fi2]]);
                        for($fi3 = 0; $fi3 < count($a2); $fi3++)
                        {
                            if(trim($array[$a[$fi1]][$a1[$fi2]][$a2[$fi3]]) == '')
                            {
                                // если нумерованный
                                if(is_integer($a2[$fi3]))
                                {
                                    array_splice($array[$a[$fi1]][$a1[$fi2]], 
                                        $a2[$fi3], 1);
                                }
                                else
                                {
                                    unset($array[$a[$fi1]][$a1[$fi2]][$a2[$fi3]]);
                                }
                            }
                        }
                    }
                    elseif(trim($array[$a[$fi1]][$a1[$fi2]]) == '')
                    {
                        if(is_integer($a1[$fi2]))
                        {
                            array_splice($array[$a[$fi1]], $a1[$fi2], 1);
                        }
                        else
                        {
                            unset($array[$a[$fi1]][$a1[$fi2]]);
                        }
                    }
                }
            }
            elseif(trim($array[$a[$fi1]]) == '')
            {
                if(is_integer($a[$fi1]))
                {
                    array_splice($array, $a[$fi1], 1);
                }
                else
                {
                    unset($array[$a[$fi1]]);
                }
            }
 
        }
    }
    return $array;
    // END "cleanArray" FUNCTION
}
 
$myArrays = cleanArray($myArray);
echo "<pre>";
print_r($arrays);
echo "</pre>";

Как видим получили желаемый результат без пустых элементов в РНР массиве и с сохранением нумерации элементов РНР массива 1,2,3,4, а не 1,3,4 в случае удаления одного из них:

Array
(
    [0] => Array
        (
            [0] => Yacht0
            [1] => Liner0
            [2] => Ferry0
        )
 
    [1] => 2345
    [2] => Array
        (
            [0] => Array
                (
                    [0] => value1
                    [1] => value2
                    [2] => 0
                )
 
            [1] => Array
                (
                    [0] => value3
                    [1] => value4
                )
 
        )
 
    [3] => Array
        (
            [0] => Array
                (
                    [0] => value5
                    [1] => value6
                    [2] => 0
                )
 
            [1] => Array
                (
                    [0] => value7
                    [1] => value8
                    [2] => value9
                    [assArr1] => assVal1
                    [assArr2] => assVal2
                    [3] => 0
                )
 
            [Files] => Array
                (
                    [0] => file1
                    [1] => file3
                )
 
            [Files2] => Array
                (
                    [0] => file12
                    [1] => file32
                    [2] => file42
                )
 
        )
 
    [Filess] => Array
        (
            [0] => file1
            [1] => file3
        )
 
    [Filess2] => Array
        (
            [0] => file12
            [1] => file32
            [2] => file42
        )
)

Первая РНР функция "function checkArray($array)" проверяет является ли присланное значение массивом и если да, то возвращает нумерованный РНР массив с именами элементов, это нужно для того чтобы одинаково обращаться по номерному идентификатору к обычным (нумерованным) и ассоциативным массивам.

Вторая РНР функция "function cleanArray($array)" собственно удаляющая элементы РНР массива с пустыми значениями, которая предварительно проверяет идентификатор элемента (цифра или строка) и его значение (вложенный массив или строковое значение). Ассоциативные элементы РНР массива просто удаляются функцией "unset($array[$a]);", элементы массива имеющие порядковые номера в качестве идентификатора удаляются функцией "array_splice($array[$a])" с сохранением порядка нумерации элементов РНР массива 1,2,3,4, а не 1,3,4 в случае удаления одного из них.

Приведённая выше РНР функция подходит как для очистки обычных массивов от пустых элементов так и для очистки многомерных обычных и ассоциативных массивов.

Автор: Олег Головский


Об авторе
Иван Шаман
Меня нет ни в Инстаграмме ни в Фейсбуке, я просто хожу по улицам и рассказываю первым встречным: сколько зарабатываю; с кем дружу; где живу и чем дышу. У меня даже появилось несколько подписчиков: ПСИХоЛОХ и участковый полицай!
Ещё статьи автора

Нет комментариев

Вы можете стать первым, кто добавит комментарий к этой записи.

Добавить комментарий

АХТУНГ! Все комменты гостей модерасятся модерастом.
  1. Мессаги исключительно рекламного содержания, либо содержащие только одни оценочные суждения типа "круто" ("отлично", "спасибо", "автор дебил" и т.п.) не публикуются;
  2. Злостным спамерам, пранкерам и прочей сетевой нечисти рекомендуем напрасно не тратить своего времени и удовлетворять свои больные фантазии на специализированных Интернет ресурсах!;
  3. Разумная обоснованная критика, замечания, дополнения приветствуются. Поля помеченные символом * обязательны к заполнению.


Защитный код
Обновить

Комментарии в блоге
Новое на форуме