删除空数组元素

1034

我的数组中有一些来自用户的空字符串元素。在执行以下操作后,$linksArray 仍然具有空元素:

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

empty() 函数也不起作用。


4
值得一提的是,上面的代码无法运行,因为unset(...)操作的是由foreach循环创建的变量,而不是明显保持不变的原始数组。 - savedario
1
如果(!empty($link)) { echo $link; } 这对我有效 - Shiplu
2
您正在更改一个未被引用的 $link!请使用 foreach($linksArray as $key => $link) unset(linksArray[$key])。 - Nijboer IT
https://dev59.com/lm855IYBdhLWcg3wSiU7#66004034 - Billu
27个回答

5
只有一句话: 更新(感谢@suther):
$array_without_empty_values = array_filter($array);

不需要第二个参数:$clean_array = array_filter($dirty_array); - suther

3
根据您的方法,您可以将这些元素捕捉到另一个数组中,并像下面这样使用它:
foreach($linksArray as $link){
   if(!empty($link)){
      $new_arr[] = $link
   }
}

print_r($new_arr);

3

使用array_filter函数来删除空值:

$linksArray = array_filter($linksArray);
print_r($linksArray);

他想要删除“空字符串”,这与空值不等价。 - Cranio

3

删除空数组元素

function removeEmptyElements(&$element)
{
    if (is_array($element)) {
        if ($key = key($element)) {
            $element[$key] = array_filter($element);
        }

        if (count($element) != count($element, COUNT_RECURSIVE)) {
            $element = array_filter(current($element), __FUNCTION__);
        }

        return $element;
    } else {
        return empty($element) ? false : $element;
    }
}

$data = array(
    'horarios' => array(),
    'grupos' => array(
        '1A' => array(
            'Juan' => array(
                'calificaciones' => array(
                    'Matematicas' => 8,
                    'Español' => 5,
                    'Ingles' => 9,
                ),
                'asistencias' => array(
                    'enero' => 20,
                    'febrero' => 10,
                    'marzo' => '',
                )
            ),
            'Damian' => array(
                'calificaciones' => array(
                    'Matematicas' => 10,
                    'Español' => '',
                    'Ingles' => 9,
                ),
                'asistencias' => array(
                    'enero' => 20,
                    'febrero' => '',
                    'marzo' => 5,
                )
            ),
        ),
        '1B' => array(
            'Mariana' => array(
                'calificaciones' => array(
                    'Matematicas' => null,
                    'Español' => 7,
                    'Ingles' => 9,
                ),
                'asistencias' => array(
                    'enero' => null,
                    'febrero' => 5,
                    'marzo' => 5,
                )
            ),
        ),
    )
);

$data = array_filter($data, 'removeEmptyElements');
var_dump($data);

¡它工作了!


3

我认为在这里使用array_walk更加合适

$linksArray = array('name', '        ', '  342', '0', 0.0, null, '', false);

array_walk($linksArray, function(&$v, $k) use (&$linksArray){
    $v = trim($v);
    if ($v == '')
        unset($linksArray[$k]);
});
print_r($linksArray);

输出:

Array
(
    [0] => name
    [2] => 342
    [3] => 0
    [4] => 0
)
  • 我们确保即使用户添加了多个空格,空值也会被删除

  • 我们还从有效值中去除了空格

  • 最后,只有(null)、(布尔值False)和('')将被视为空字符串

至于False,可以将其删除,因为据我所知用户无法提交布尔值。


1
使用这些类型的东西时,最好明确你想要什么和不想要什么。这将有助于下一个人不会因为没有回调函数而被 array_filter() 的行为所困扰。例如,我之所以来到这个问题是因为我忘记了 array_filter() 是否会删除 NULL。我浪费了时间,当我可以使用下面的解决方案并得到我的答案。
此外,这种逻辑在语言上是独立的,也就是说,代码可以复制到另一种语言中,而无需了解像 array_filter 这样的 php 函数在没有传递回调时的行为。
在我的解决方案中,一目了然地看到发生了什么。删除条件以保留某些内容或添加新条件以过滤其他值。
忽略实际使用的 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]

现在你可以使用pipe()动态创建一个名为filterer()的函数,它将为您应用这些部分应用的函数。
<?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

试试这个 ** 示例

$or = array(
        'PersonalInformation.first_name' => $this->request->data['User']['first_name'],
        'PersonalInformation.last_name' => $this->request->data['User']['last_name'],
        'PersonalInformation.primary_phone' => $this->request->data['User']['primary_phone'],
        'PersonalInformation.dob' => $this->request->data['User']['dob'],
        'User.email' => $this->request->data['User']['email'],
    );



 $or = array_filter($or);

    $condition = array(
        'User.role' => array('U', 'P'),
        'User.user_status' => array('active', 'lead', 'inactive'),
        'OR' => $or
    );

2
这是什么?还有很多其他非常相关的答案。你在这里添加什么? - Félix Adriyel Gagnon-Grenier
请查看URL,这里的问题是什么!!/删除空数组元素/ - Ashish Pathak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接