【发布时间】: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;
}
}));;
我也可以尝试使用foreach 或array_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 为我提供链接!