在PHP中验证2D数组中的每个值

时间:2018-02-11 19:57:05

标签: php arrays loops

我有一个2D数组,如下所示:

Array
(
    [0] => Array
        (
            [0] => 12345678
            [1] => 56
        )
    [1] => Array
        (
            [0] => 34567822
            [1] => 67
        )
    [2] => Array
        (
            [0] => 12324654
            [1] => 98
        )
    [3] => Array
        (
            [0] => 234769O1
            [1] => 45
        )
)

我想检查每个值,例如$array[0][0]是否长8位且$array[0][1]是否介于1和100之间..但我想为每个数组执行此操作,因此我在想一个for循环,但我不能让它工作。

这就是我尝试过的,它会完全归还所有内容:

foreach ($data as $student) {
    foreach ($student as $key => $value) {
        echo $student[$key];
    }
} 

我可以得到一些帮助吗?

4 个答案:

答案 0 :(得分:1)

一段代码示例:

foreach ($data as $student) {
    if (strlen($student[0]) == 8 && (1 <= $student[1] && $student[1] <= 100)) {
        echo 'Fits';
    }
}

答案 1 :(得分:1)

您可以使用array_filter获取阵列中的所有有效项目:

//your array with valid and invalid items.
$arr = [
    [12345678, 56],
    [34567822, 67],
    [12324654, 98],
    ['234769O1', 45]
];

//filter all items of the array with 8 digits on index 0 and 
//a number between 1 and 100 on index 1.
$valid_arr = array_filter($arr, function($v) {
    return preg_match("/^[0-9]{8}$/", $v[0]) === 1 && $v[1] >= 1 && $v[1] <= 100;
});

如果您想获取阵列中的所有无效项目,可以使用以下代码:

$invalid_arr = array_filter($arr, function($v) {
    return !(preg_match("/^[0-9]{8}$/", $v[0]) === 1 && $v[1] >= 1 && $v[1] <= 100);
});
  

演示: https://ideone.com/LP3VM6

如果您需要使用foreach循环,可以使用以下解决方案:

$arr = [
    [12345678, 56],
    [34567822, 67],
    [12324654, 98],
    ['234769O1', 45]
];

foreach ($arr as $item) {
    if (preg_match("/^[0-9]{8}$/", $item[0]) === 1 && $item[1] >= 1 && $item[1] <= 100) {
        echo $item[0].':'.$item[1];
    }
}
  

演示: https://ideone.com/X8XIp8

答案 2 :(得分:1)

如果需要删除它们,可以过滤数组:

$array = array_filter($array, function($v) {
                                  return strlen($v[0]) == 8 &&
                                         $v[1] > 0 &&
                                         $v[1] < 101;
                              }

如果您需要额外的数字检查,那么:

return strlen($v[0]) == 8 &&
       is_numeric($v[0])  &&
       $v[1] > 0 && $v[1] < 101;

答案 3 :(得分:1)

你可以这样做:

$array =  array(
    array(12345678,56),
    array(34567822,67),
    array(123123312,123),
    array(123123,33),
    array(12324654,98),
    array(23476901,45),
    array(1231412,101),
);

foreach($array as $a) {
    if(strlen($a[0]) == 8 && $a[1] > 1 && $a[1] < 100) {
        // conditions met
    } else {
        // conditions not met
    }
}

我在数组中添加了一些不通过测试的元素。

在您的示例中,您编写了[0] => 234769O1,其中您使用了字母 O 而不是数字 0 。也许这是你代码中的错误。