【问题标题】:isset() not allowed as callback for array_filter()isset() 不允许作为 array_filter() 的回调
【发布时间】:2016-12-15 16:14:36
【问题描述】:

如果您想从数组中删除空值,那么通过简单的array_filter() 传递它们并使用内置的isset() 函数似乎是一个不错的选择:

$dairyFree = true;
$toppings = [
 'tomato',
 'oregano',
 'pepperoni',
 ($dairyFree) ? null : 'cheese',
];

$toppings = array_filter($toppings, 'isset');

很简单,但是在array_filter() 中使用isset() 会引发以下警告:

警告:array_filter() 期望参数 2 是有效的回调,未找到函数 'isset' 或无效的函数名。

将相同的代码包装在闭包中很容易,但我的问题是——为什么 php 会拒绝 isset() 函数而不是其他内部函数,例如 strlen()

【问题讨论】:

  • 你应该写一个自定义函数,在里面调用isset。
  • 因为这是一种语言结构而不是函数,所以不能使用变量函数调用它。 或者在需要函数的地方使用。

标签: php


【解决方案1】:

isset 不完全是一个函数,它是一个类似echo 的构造。如果您只是想从数组中删除null 值,那么没有isset 参数就足够了。

<?php
    $dairyFree = true;
    $toppings = [
      'tomato',
      'oregano',
      'pepperoni',
      ($dairyFree) ? null : 'cheese',
    ];
    $toppings = array_filter($toppings);
    print_r($toppings);
?>

这个输出:

Array
(
    [0] => tomato
    [1] => oregano
    [2] => pepperoni
)

【讨论】:

  • 需要注意的是,array_filter 的默认功能将过滤掉任何松散地等同于 false 的值。这意味着 null、false、0 或空字符串。
  • 好答案。有趣的是,这些语言结构(如list 和显然isset)作为函数属于文档。在我的特定应用程序中,我需要 null 值来退出,而不仅仅是虚假值。
  • @jpschroeder 是的...然后您需要创建一个可调用的回调函数。嘿,别忘了接受我的回答伙伴。
  • @jpschroeder 你需要的是not_is_null(),但在php中只有is_null()是一个函数:)
【解决方案2】:

怎么样:

$toppings = array_filter($toppings, function($a){return isset($a);});

更新:算了,你在你的问题中注意到了这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    相关资源
    最近更新 更多