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

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

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

<?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 в случае удаления одного из них.

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

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


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


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

2 megabytes