Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中从多维数组获取平面数组的内置方法_Php_Arrays_Filter - Fatal编程技术网

PHP中从多维数组获取平面数组的内置方法

PHP中从多维数组获取平面数组的内置方法,php,arrays,filter,Php,Arrays,Filter,我正在寻找一种短的、内置的方法来从PHP中多维数组的值(我对数组键不感兴趣)获取平面数组 是否有任何内置函数可以从多维数组中获取元素数组(不是数组)?我搜索了array_flat或类似的关键字,但什么也没找到 虽然我正在寻找一种在PHP中获得平面数组的有效方法,但我真正想要的是按以下方式使用数组过滤器:方法 $result = array_filter($array, '!is_array') 或者可能: $result = array_filter($array, 'is_array ===

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

是否有任何内置函数可以从多维数组中获取元素数组(不是数组)?我搜索了array_flat或类似的关键字,但什么也没找到

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

$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;
  }
}));;
第二种解决方案:

$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\u 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可能是回调的一个arg数组。所以我需要调整这些数组,以确定哪些参数是哪个

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


PHP版本为7.3

不建议将其作为其提升通知,但您可以使用和(添加
@
以避免该通知),如下所示:

这将起作用,因为
array\u flip
将遇到一个通知,因为array不能是键->因此它实际上会过滤非数组-但这不是最佳做法! 我建议你写你的自定义函数-不明白为什么你不能这么做


实例:

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

代码:()

输出:

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

Thr PHP文档:

这里有一个链接。我希望在编辑时看到一些示例数据和您想要的确切输出。感谢Maurice编辑标题!谢谢你为我提供的链接!很好-比我的答案更好-我喜欢示例数据;)很有可能你的表现会更好,但我会尽力避开stfu接线员。此外,如果有关系的话,你的是索引的。(很抱歉掐了你的输入数组,我在手机上。)@dWinder另一方面,一些标量值可能会被你的关键技术改变,重复的值将被删除。没问题-我把它放在那里是为了分享。我完全同意stfu——我试图尽可能清楚地表明这是一种糟糕的做法。关于复制,你是对的,这一点很好!。我想知道我应该保留还是删除我的帖子-让未来的用户决定他们喜欢什么。这似乎正是我想要的!!很好的解决方案。然而正如mickmackusa所评论的,它可能会失败:我喜欢你的答案的一点是,你解释了@的作用。我不知道这会避免通知。温暖。只要你清楚缺点,就可以保留情境正确的答案。例如: