【问题标题】:How to check if any of value is empty in multidimensional array?如何检查多维数组中的任何值是否为空?
【发布时间】:2017-12-22 18:07:50
【问题描述】:

如何检查多维数组中的任何值是否为空。我在网上搜索并找到不同的解决方案,但不是我需要的。解决方案是针对所有值或某些特定值或过滤掉某些值等等。

问题是我有一个可以有 2 或 10 个输入字段的表单,它们与姓名和姓氏和包装输入字段重复,但我可以有多个,并且所有这些都需要填写,所以如果有的话数组中的字段为空,我应该找到它并向用户返回错误,因此他必须填写所有数组字段。

[povratna_odrasli] => Array
    (
        [1] => Array
            (
                [ime] => 
                [prezime] => 
                [prtljag] => bez
            )

        [2] => Array
            (
                [ime] => 
                [prezime] => 
                [prtljag] => bez
            )

        [3] => Array
            (
                [ime] => 
                [prezime] => 
                [prtljag] => bez
            )

    )

[povratna_deca] => Array
    (
        [1] => Array
            (
                [ime] => 
                [prezime] => 
                [prtljag] => bez
                [godine] => 0
            )

    )

这基本上是提交表单时数组的样子

【问题讨论】:

  • 如果您通过 <form> 提交输入字段,您只需输入 required 参数,在 HTML 上将不允许他们提交表单,直到他们填写所有必填字段.
  • 你能举个例子吗?你的数组中只有这两个键吗?
  • @N.Ivanov 这只是前端验证,可以通过更改开发人员控制台中的 html 来绕过。最好的解决方案是在输入字段中使用必需的参数并检查 PHP 中的空值,就像 OP 询问的那样。
  • 是的,我也可以在用户提交之前使用 javascript 进行检查,但是如果他在 chrome 的开发人员工具中乱来,他可以删除所需的参数和 js,这样他就可以不受任何限制地提交。是的,输入是通过表单提交的。
  • 这是您在 print_r($_POST) @NimeshkaSrimal 时得到的,这是来自提交表单的输入字段的示例

标签: php arrays multidimensional-array


【解决方案1】:

您应该能够使用array_walk_recursive 来遍历数组,它是这样的子数组。

$arr=array(
    'povratna_odrasli'  =>  array(
        array('ime' =>  '','prezime'=>'','prtljag'=>'bez'),
        array('ime' =>  '','prezime'=>'','prtljag'=>'baz'),
        array('ime' =>  'knickers','prezime'=>'','prtljag'=>'baz')
    ),
    'povratna_deca'     =>  array(
        array('ime' =>  '', 'prezime'=>'', 'prtljag'=>'bez', 'godine'=>0)
    )
);
$output=array();
$status=array_walk_recursive( $arr, function($v,$k,$o){
    if( empty( $v ) && $v!==0 )$o[$k]=$v;
},&$output );

if( !empty( $output ) )echo '<pre>',print_r($output,true),'</pre>';

哪些输出:

Array
(
    [ime] => 
    [prezime] => 
)

如果$output var 不为空,那么您知道以某种方式进一步处理。

您可以在PHP site 上找到完整的描述,以及array_walk_recursive 的用法示例

更高版本的 PHP 在通过引用传递第三个参数时抛出 "PHP Fatal error: Call-time pass-by-reference has been removed": - 而是在回调中将 $output 变量声明为全局变量

$status=array_walk_recursive( $arr, function($v,$k){
    global $output;
    if( empty( $v ) && $v!==0 )$output[$k]=$v;
} );

【讨论】:

  • 什么是:function($v,$k,$o)?在 php 页面上查看更多关于 array_walk_recursive 的信息
  • 这是一个回调函数——参数$v = $value$k = $key$o = $output
  • 您将一个函数传递给 array_walk_recursive,该函数递归地应用于每个值。在此函数中,您可以检查该值是否为空
  • 我收到Call-time pass-by-reference has been removed 错误,因为我使用的是 php 5.6。在 php 页面上有与您类似的答案,但没有人解释错误,因此请进一步搜索。
  • 好的 - 我还有 5.3.2 所以不知道可能有问题。而不是通过引用传递$output 作为第三个参数,您可以在回调函数中将其声明为全局
猜你喜欢
  • 2013-08-26
  • 1970-01-01
  • 2013-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
相关资源
最近更新 更多