【问题标题】:Built-in method to get flat array from a multidimensional array in PHP从 PHP 中的多维数组中获取平面数组的内置方法
【发布时间】:2019-07-22 12:51:53
【问题描述】:

我正在寻找一种简短的内置方法来从 PHP 中多维数组的值(我对数组键不感兴趣)获取平面数组。

是否有任何内置函数可以从多维数组中获取元素数组(不是数组)?我搜索了 array_flat 或类似的关键字,但一无所获。

虽然我正在寻找一种在 PHP 中获取平面数组的有效方法,但我真正想要的是在以下方式中使用 array_filter:方式。

$result = array_filter($array, '!is_array')

或许:

$result = array_filter($array, 'is_array === false')

但是,上面的代码不起作用。

以下解决方案有效,但它们不是我想要的。

第一种解决方案:

$result = array_diff(array_values($array), array_filter(array_values($array), 'is_array'));

第二个解决方案:

$result =  (array_filter(array_values($args), function($value) {
  if(!is_array($value)) {
    return $value;
  }
}));;

我也可以尝试使用foreacharray_map,但我想编写更少的代码。

这是为什么? 基本上,为了帮助我进行文件上传和表单验证,我正在构建一个名为 Validator 的类,它将接受回调(尽可能多的)然后执行。可以在验证之前、验证期间和验证之后传递回调以运行。这些是主要的回调;对于每个主回调,如果主回调失败,可以传递一个“onfailure”回调来运行,如果成功,则可以传递一个“onsuccess”回调。 Validator 类在添加函数时将非常灵活和自定义其参数,因此我需要创建一个稍微复杂的代码来查找哪个参数是哪个。参数可能有嵌套数组,这就是为什么我想要一种有效的方法来展平嵌套数组。

我的 Validtor 类的 addCallback 方法将能够接收以下参数:

    'aftervalidation', $callback, $args
    ['onvalidation', 'callback' => $callback, 'args' => $args]
    ['onvalidation', [callback => $callback, 'args' => $args], ]
    ['onvalidation', [$callback, 'args' => $args], ['onsuccess' => $callback, 'args'=> args]]
    ['aftervalidation', ['callback', 'args' => $args], ['onsuccess' => $callback, $args]]
    ['beforevalidation', ['callback;, 'args' => $args], ['onsuccess' => $callback,]]
    ['aftervalidation', [$callback, 'args' => $args], ['onsuccess' => $callback', 'args' => args]]
    ['onvalidation', ['callback' => $callback, 'args' => $args], ['onsuccess' => $callback', $args]]
    ['beforevalidation', ['callback' => $callback, $args], ['onsuccess' => $callback']]
    ['aftervalidation', [$callback, 'args' => $args], 'onsuccess' => [$callback]]
    ['onvalidation', [$callback, 'args' => $args], 'onsuccess' => [$callback, args]]
    ['onvalidation', [$callback, 'args' => $args], 'onsuccess' => [$callback, 'args' => $args]]
    ['onvalidation, [$callback, 'args' => $args], 'onsuccess' => ['callback' => $callback, 'args' => $args]]

除了这些嵌套数组,$args 可能是回调的 args 数组。所以我需要对这些数组进行展平以找出哪个参数是哪个。

注意:出于个人原因,不能为其创建自定义函数。

PHP版本是7.3

【问题讨论】:

  • edit 这是一个链接。
  • 我很乐意在您进行编辑时看到一些示例数据和您想要的确切输出。
  • 感谢 Maurice 编辑标题!感谢 u_molder 为我提供链接!

标签: php arrays filter


【解决方案1】:

我认为您希望保留标量值(但您尚未显示任何示例数据,因此我无法确定)。

代码:(Demo)

$array = [3, "AA", [1,2], 444, ["V"]];
var_export(array_filter($array, 'is_scalar'));

输出:

array (
  0 => 3,
  1 => 'AA',
  3 => 444,
)

Thr PHP 文档:https://www.php.net/manual/en/function.is-scalar.php

【讨论】:

  • 很好 - 比我的答案更好 - 我喜欢示例数据 ;)
  • 很有可能你的性能更好,但我竭尽全力避免使用 stfu 运算符。此外,您的已编入索引——如果重要的话。 (对不起,捏了你的输入数组,我在我的手机上。)
  • @dWinder 另一方面,一些标量值可能会被您的关键技术改变,重复值会教区。
  • 没问题 - 我把它放在那里分享。而且我完全同意 stfu - 我试图尽可能清楚地说明这是不好的做法。你是对的重复 - 好点!我想知道我应该保留我的帖子还是删除它 - 让未来的用户决定他们喜欢什么。
  • 这似乎正是我想要的!
【解决方案2】:

不推荐作为其加薪通知,但您可以使用array-keysarray-flip(添加@ 以避免通知)作为:

$a = @array_keys(array_flip($arr));

这将起作用,因为array_flip 会遇到一个通知,因为数组不能是键 -> 所以它实际上过滤了非数组 - 但这不是最佳实践! 我建议您编写自定义函数 - 不明白为什么不能这样做...

现场示例:3v4l

【讨论】:

  • 很好的解决方案。然而;正如 mickmackusa 评论的那样,它可能会失败:3v4l.org/vPOj8
  • 我喜欢您的回答的一点是您解释了 @ 的作用。我不知道它会避免notice.warming。
  • 只要您清楚缺点,就可以保留情境正确的答案。例如:stackoverflow.com/a/57091605/2943403
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
  • 2018-12-10
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多