ChatGPT解决这个技术问题 Extra ChatGPT

删除空数组元素

根据用户提交的内容,我的数组中的某些元素是空字符串。我需要删除这些元素。我有这个:

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

但它不起作用。 $linksArray 仍有空元素。我也尝试过使用 empty() 函数,但结果是一样的。

我认为值得一提的是,上面的代码不起作用,因为 unset(...) 对 foreach 循环创建的变量进行操作,而不是显然保持在循环之前的原始数组。
if(!empty($link)) { echo $link; } 这对我有用
您正在更改未引用的 $link !使用 foreach($linksArray as $key => $link) unset(linksArray[$key])

A
Avatar

在处理字符串数组时,您可以简单地使用 array_filter(),它可以方便地为您处理所有这些:

print_r(array_filter($linksArray));

请记住,如果没有提供回调,所有等于 FALSE 的数组条目(请参阅 converting to boolean)都将被删除。因此,如果您需要保留确切字符串 '0' 的元素,您将需要一个自定义回调:

// PHP 7.4 and later
print_r(array_filter($linksArray, fn($value) => !is_null($value) && $value !== ''));

// PHP 5.3 and later
print_r(array_filter($linksArray, function($value) { return !is_null($value) && $value !== ''; }));

// PHP < 5.3
print_r(array_filter($linksArray, create_function('$value', 'return $value !== "";')));

注意:如果您需要在删除空元素后重新索引数组,请使用:$linksArray = array_values(array_filter($linksArray));


array_filter 应该删除空元素。如果 PHP 对空的定义与您的定义不太一样,那么您可以在回调选项中填写一个匿名函数,该函数会抛出不需要的元素。显然你必须有 php 5.3 或更高版本才能使用匿名回调。 stackoverflow.com/questions/2412299/…
注意 array_filter 不会重新索引数组索引(在 for 语句中使用进程数组时可能会出现问题)。所以用 array_values 函数包装它。
答案不正确,因为它也会删除 false 元素。 (php.net/manual/en/function.array-filter.php)
@Deji您是否尝试过在过滤之前打印该数组?我认为第二次设置 a 只会重置第一次。
@Cranio:另一条评论已经涵盖了这一点。这不是不正确的,但可能比您的要求更广泛。这并不意味着其他人仍然无法找到它的帮助;毕竟,如果你只有数组中的字符串,这个答案只会删除空的。
r
rybo111

您可以使用 array_filter 删除空元素:

$emptyRemoved = array_filter($linksArray);

如果您的数组中有 (int) 0,则可以使用以下内容:

$emptyRemoved = remove_empty($linksArray);

function remove_empty($array) {
  return array_filter($array, '_remove_empty_internal');
}

function _remove_empty_internal($value) {
  return !empty($value) || $value === 0;
}

编辑:也许您的元素本身不是空的,而是包含一个或多个空格...您可以在使用 array_filter 之前使用以下内容

$trimmedArray = array_map('trim', $linksArray);

我刚刚将它添加到 BoltClock 接受的答案中,您可以简单地执行 array_filter($foo, 'strlen') 以避免“0”问题,并且只删除那些长度为零的问题。
@nezZario:假设您的数组中只有 scalar 个项目是的。否则,你不能这样做。
将 lambda 用于 php >= 5.3 function remove_empty($array) { return array_filter($array, function($value){return !empty($value) || $value === 0;}); }
array_map() 因为我在那些空数组中有空格,所以做了魔术!
P
Philipp

关于这个主题的最受欢迎的答案绝对是不正确的。

考虑以下 PHP 脚本:

<?php
$arr = array('1', '', '2', '3', '0');
// Incorrect:
print_r(array_filter($arr));
// Correct:
print_r(array_filter($arr, 'strlen'));

为什么是这样?因为包含单个 '0' 字符的字符串也评估为布尔值 false,所以即使它不是空字符串,它仍然会被过滤。那将是一个错误。

将内置的 strlen 函数作为过滤函数传递将起作用,因为它为非空字符串返回一个非零整数,为空字符串返回一个零整数。非零整数在转换为布尔值时始终评估为真,而零整数在转换为布尔值时始终评估为假。

所以,绝对的、确定的、正确的答案是:

$arr = array_filter($arr, 'strlen');

同意。对于那些数组包含字符串的人来说,这应该是公认的答案
赞成。一个比许多其他答案更好的答案,但是应该注意的是,当前接受的答案在技术上并不是不正确的,因为“空”确实在 PHP 中具有特殊含义。 (一些符合“空”条件的值:0""null
它们不是不正确的,这都是关于上下文的。在某些情况下,保留值 0 可能很重要。所以请不要说除了你以外的所有人都是错的
如果数组包含另一个数组,则会中断:strlen() expects parameter 1 to be string, array given
你可以说这也可以是一个很好的方法(而不是说别人不正确)来实现一个人想要的动作。基本上不是所有的情况都是相似的。尽管这种方法适用于我的情况。
t
tamasd
$linksArray = array_filter($linksArray);

“如果没有提供回调,所有等于 FALSE 的输入条目都将被删除。” -- http://php.net/manual/en/function.array-filter.php


在谷歌解决问题后,我也试过这个。不幸的是,它为我留下了空白元素。
@Will:你确定吗?它也删除了空字符串,我成功地测试了这个。也许您的输入值包含空格,应该先修剪。根据 boolean conversion rules,空字符串被评估为 false,因此被 array_filter 删除。
m
matija kancijan
    $myarray = array_filter($myarray, 'strlen');  //removes null values but leaves "0"
    $myarray = array_filter($myarray);            //removes all null values

strlen 也删除了 false :(
仅当 false 是字符串时。布尔值 false 没有字符串长度。
从 PHP8.1 开始,strlen 不再是一种好的技术,因为它会产生弃用。 Deprecated: strlen(): Passing null to parameter #1 ($string) of type string is deprecated
h
helpse

你可以做

array_filter($array)

array_filter: "如果没有提供回调,所有等于 FALSE 的输入条目都将被删除。"这意味着值为 NULL、0、'0'、''、FALSE、array() 的元素也将被删除。

另一种选择是

array_diff($array, array(''))

这将删除值为 NULL、'' 和 FALSE 的元素。

希望这可以帮助 :)

更新

这是一个例子。

$a = array(0, '0', NULL, FALSE, '', array());

var_dump(array_filter($a));
// array()

var_dump(array_diff($a, array(0))) // 0 / '0'
// array(NULL, FALSE, '', array());

var_dump(array_diff($a, array(NULL))) // NULL / FALSE / ''
// array(0, '0', array())

总结一下:

0 或 '0' 将删除 0 和 '0'

NULL、FALSE 或 '' 将删除 NULL、FALSE 和 ''


r
rybo111
foreach($linksArray as $key => $link) 
{ 
    if($link === '') 
    { 
        unset($linksArray[$key]); 
    } 
} 
print_r($linksArray); 

不删除 false0 的简洁、易读且安全的解决方案。考虑到这是与接受的答案在同一分钟发布的(这是不安全且不正确的),我只能假设您的 8 个赞成票与接受的答案的 649 相比,后者是一个单行解决方案.
@rybo111 - 可能,尽管在对 array_filter() 的回调中使用该逻辑将是比 foreach() 循环更干净的方法
也许更快,但您的解决方案是最易读的,这很重要。对于那些使用需要 trim() 的解决方案的用户,我建议使用 if(is_string($link) && trim($link) === '')
m
marcovtwout

另一个从数组中删除空(“”空字符串)元素的衬垫。

$array = array_filter($array, function($a) {return $a !== "";});

注意:此代码故意保留 null0false 元素。

或者,也许您想先修剪数组元素:

$array = array_filter($array, function($a) {
    return trim($a) !== "";
});

注意:此代码还会删除 nullfalse 元素。


正是我需要的,这也与 older PHPs 兼容,谢谢! ;-)
@JohnK 错了。要做到这一点,就像用户想要回调一样,除非您想删除 alzo zeroes 和其他虚假值。
N
Nabi K.A.Z.

简而言之:

这是我建议的代码:

$myarray =  array_values(array_filter(array_map('trim', $myarray), 'strlen'));

解释:

我认为使用 array_filter 很好,但还不够,因为值就像 space\n,... 保留在数组中,这通常很糟糕。

所以我建议你混合使用‍‍array_filterarray_map

array_map 用于修剪,array_filter 用于删除空值,strlen 用于保留 0 值,array_values 用于根据需要重新索引。

样品:

$myarray = array("\r", "\n", "\r\n", "", " ", "0", "a");

// "\r", "\n", "\r\n", " ", "a"
$new1 = array_filter($myarray);

// "a"
$new2 = array_filter(array_map('trim', $myarray));

// "0", "a"
$new3 = array_filter(array_map('trim', $myarray), 'strlen');

// "0", "a" (reindex)
$new4 = array_values(array_filter(array_map('trim', $myarray), 'strlen'));

var_dump($new1, $new2, $new3, $new4);

结果:

array(5) {
  [0]=>
" string(1) "
  [1]=>
  string(1) "
"
  [2]=>
  string(2) "
"
  [4]=>
  string(1) " "
  [6]=>
  string(1) "a"
}
array(1) {
  [6]=>
  string(1) "a"
}
array(2) {
  [5]=>
  string(1) "0"
  [6]=>
  string(1) "a"
}
array(2) {
  [0]=>
  string(1) "0"
  [1]=>
  string(1) "a"
}

在线测试:

http://sandbox.onlinephpfunctions.com/code/e02f5d8795938be9f0fa6f4c17245a9bf8777404


C
Community

如果您正在使用数值数组并且需要在删除空元素后重新索引数组,请使用 array_values 函数:

array_values(array_filter($array));

另请参阅:PHP reindex array?


C
Community

投票最多的答案是错误的,或者至少不完全正确,因为 OP 只谈论空白字符串。这是一个彻底的解释:

空是什么意思?

首先,我们必须就空的含义达成一致。你的意思是过滤掉:

只有空字符串(“”)?严格错误的价值观? ($element === false) 错误值? (即0, 0.0, "", "0", NULL, array()...) 相当于PHP的empty()函数?

你如何过滤掉这些值

仅过滤掉空字符串:

$filtered = array_diff($originalArray, array(""));

要仅过滤掉严格错误的值,您必须使用回调函数:

$filtered = array_diff($originalArray, 'myCallback');
function myCallback($var) {
    return $var === false;
}

回调对于您想要过滤掉“假”值的任何组合也很有用,除了一些。 (例如,过滤每个 nullfalse 等,只留下 0):

$filtered = array_filter($originalArray, 'myCallback');
function myCallback($var) {
    return ($var === 0 || $var === '0');
}

第三种和第四种情况(最终出于我们的目的)是等效的,为此您必须使用默认值:

$filtered = array_filter($originalArray);

如果你想取出nullfalse,但保留0,你也可以使用php内置的strlen函数作为你的回调。
u
user2511140
$a = array(1, '', '', '', 2, '', 3, 4);
$b = array_values(array_filter($a));

print_r($b)

array_values 使索引连续。谢谢 :)
H
HMagdy

对于多维数组

$data = array_map('array_filter', $data);
$data = array_filter($data);

r
rybo111

我必须这样做才能保持 (string) 0 的数组值

$url = array_filter($data, function ($value) {
  return (!empty($value) || $value === 0 || $value==='0');
});

r
rybo111
$out_array = array_filter($input_array, function($item) 
{ 
    return !empty($item['key_of_array_to_check_whether_it_is_empty']); 
}
);

s
step
function trim_array($Array)
{
    foreach ($Array as $value) {
        if(trim($value) === '') {
            $index = array_search($value, $Array);
            unset($Array[$index]);
        }
    }
    return $Array;
}

c
concept w

我使用以下脚本从数组中删除空元素

for ($i=0; $i<$count($Array); $i++)
  {
    if (empty($Array[$i])) unset($Array[$i]);
  }

B
Bhargav Variya

只是想为循环提供替代方案……同时解决键中的空白……

就我而言,我想在操作完成后保留顺序数组键(不仅仅是奇数,这正是我所关注的。设置代码以仅查找奇数键对我来说似乎很脆弱,而且对未来不友好。)

我在寻找更像这样的东西:http://gotofritz.net/blog/howto/removing-empty-array-elements-php/

array_filter 和 array_slice 的组合可以解决问题。

$example = array_filter($example);
$example = array_slice($example,0);

不知道效率或基准,但它有效。


我认为array_values 的结果与array_slice 相同。就稍后阅读代码和理解它在做什么而言,这似乎更直观。
M
Matt

只有一行:更新(感谢@suther):

$array_without_empty_values = array_filter($array);

不需要你的第二个参数: $clean_array = array_filter($dirty_array);
K
Kyslik
$my = ("0"=>" ","1"=>"5","2"=>"6","3"=>" ");   

foreach ($my as $key => $value) {
    if (is_null($value)) unset($my[$key]);
}

foreach ($my as $key => $value) {
    echo   $key . ':' . $value . '<br>';
} 

输出

1:5 2:6


R
Robin van Baalen
foreach($arr as $key => $val){
   if (empty($val)) unset($arr[$key];
}

J
Jens Erat

使用 array_filter 函数删除空值:

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

他想删除空白字符串,这不等于空值。
i
iBet7o

删除空数组元素

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);

有用!


R
Rain

我认为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)、(Boolean False) 和 ('') 将被视为空字符串

至于 False,可以删除它,因为 AFAIK 用户无法提交布尔值。


S
Shahrukh Anwar

根据您的方法,您可以在另一个数组中捕获这些元素并使用如下所示的元素,

foreach($linksArray as $link){
   if(!empty($link)){
      $new_arr[] = $link
   }
}

print_r($new_arr);

A
Ashish Pathak

试试这个** **示例

$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
    );

这是什么?还有很多其他非常相关的答案。你在这里添加什么?
查看 url 这里有什么问题!!/*删除空数组元素*/
p
puiu

对于这些类型的事情,最好明确说明您想要什么和不想要什么。

它将帮助下一个人在没有回调的情况下不会对 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]