验证并显示来自多维数组的错误

To get famous sports from counties, I created this form.

$sports = array (
            'Australia' =>  array (
                            1 => 'Cricket',
                            2 => 'Foot Ball',
                            3 => 'Net Ball',
                            4 => 'Kabadi',
                            5 => 'Ragby',
                            6 => 'Basket Ball',
                            7 => 'Volley Ball',
                        ),          
          'New Zealand' =>  array (
                            1 => 'Cricket',
                            2 => 'Foot Ball',
                            3 => 'Net Ball',
                            4 => 'Ragby',
                            5 => 'Basket Ball',                         
                        ),        
              'England' =>  array (
                            1 => 'Cricket',
                            2 => 'Foot Ball',
                            3 => 'Net Ball',
                            4 => 'Ragby',
                            5 => 'Karom',                           
                            6 => 'Basket Ball',                         
                            7 => 'Table Tennis',                            
                            8 => 'Tennis',                          
                        ), 
                );

echo '<br><form action="" method="post">';
    foreach ( $sports AS $country => $sport ) { 
        echo "<h3>{$country}</h3
";    
        foreach ($sport AS $k => $v) { 
            echo "<br /><input type='checkbox'  name='country-sport[{$country}][]' value='{$k}' />{$v}
";
        } 
    }
echo "
<br><input type='submit' value='go' />
</form>";

My problem is When I am going to validate this. Here I need to check some conditions with this form validation.

  1. country-subject array is completely empty or not
  2. at least 1 or upto 3 sports for each countries have selected or not

these conditions not met need to display error message.

I tried something like this.. with this code I can get 1st error message which is if whole array is empty..

UPDATE : this is my validation code so far..

if ( isset($_POST['country-sport']) && is_array( $_POST['country-sport'])) {

    foreach ( $_POST['country-sport'] AS $country => $sport) { 

        if ( count($sport) >= 1 && count($sport) <= 3) { //checking that it has 3 or more values.
             //process
        } else {
            echo "select at leat 1 or upto 3 sports for {$country} ";          
        }   
    }

} else {    
    echo 'You have not selected sports for any country!';
}

UPDATE : with var_dump($_POST['country-sport']);

array(3) {
  ["Australia"]=>
  array(3) {
    [0]=>
    string(1) "1"
    [1]=>
    string(1) "2"
    [2]=>
    string(1) "3"
  }
  ["New Zealand"]=>
  array(3) {
    [0]=>
    string(1) "2"
    [1]=>
    string(1) "3"
    [2]=>
    string(1) "4"
  }
  ["England"]=>
  array(3) {
    [0]=>
    string(1) "6"
    [1]=>
    string(1) "7"
    [2]=>
    string(1) "8"
  }
}

try this:

if ( isset($_POST['country-sport']) && !empty( $_POST['country-sport'])) {//using empty

    foreach ( $_POST['country-sport'] AS $country => $sport) { 

        if ( count($sport) > 2) { //checking that it has 3 or more values.
             //process
        } else {
            echo "select at leat 1 or upto 3 sports for {$country} ";          
        }   
    }
} else {    
    echo 'You have not selected sports for any country!';
}

I see that the best way to do it is to break it down into chunks by looping through each country individually checking that the sports for the country meet the requirements you stated (empty or not, and/or has at least 1 to 3 sports selected), then put the result of the error in a separate array as to whether it has valdiated.

That means that once it has run through the countries you will have an array with a similar structure below as to which ones are valid and which ones haven't. From there you can then display your error and the reason. You could even highlight the country which hasn't been filled in correctly because you've broken it all down.

$result = array(
    'Australia' => array('error' => false, 'reason' => ''),
    'New Zealand' => array('error' => true, 'reason' => 'No countries selected')
);

Please try below code:

<?php
if (isset($_POST['country-sport']) && is_array($_POST['country-sport']))
{      
    foreach ($_POST['country-sport'] AS $country => $sport)
    {
        $varTotal = 0;
        foreach($sport as $k=>$v)
        {
            if($v != '')
            {
                $varTotal += 1;
            }
        }
        if ($varTotal >= 1 && $varTotal <= 3)
        {

        } 
        else
        {
            $arrError[$country] = 'select at least 1 or upto 3 sports for '.$country ;
        }
    }
    print_r($arrError);
} 
else
{
    echo 'You have not selected sports for any country!';
}
?>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>
    <body>
        <?php
        $sports = array(
            'Australia' => array(
                1 => 'Cricket',
                2 => 'Foot Ball',
                3 => 'Net Ball',
                4 => 'Kabadi',
                5 => 'Ragby',
                6 => 'Basket Ball',
                7 => 'Volley Ball',
            ),
            'New Zealand' => array(
                1 => 'Cricket',
                2 => 'Foot Ball',
                3 => 'Net Ball',
                4 => 'Ragby',
                5 => 'Basket Ball',
            ),
            'England' => array(
                1 => 'Cricket',
                2 => 'Foot Ball',
                3 => 'Net Ball',
                4 => 'Ragby',
                5 => 'Karom',
                6 => 'Basket Ball',
                7 => 'Table Tennis',
                8 => 'Tennis',
            ),
        );

        echo '<br><form action="" method="post">';
        foreach ($sports AS $country => $sport)
        {
            echo "<h3>{$country}</h3
";
            $i=0;
            foreach ($sport AS $k => $v)
            {  
                // This will help to get all the fields name in post 
                echo "<input type='hidden'  name='country-sport[{$country}][]' value='' />";              
                echo "<br /><input type='checkbox'  name='country-sport[{$country}][]' value='{$k}' />{$v}
";
                $i++;
            }
        }
        echo "
<br><input type='submit' value='go' />
</form>";
        ?>
    </body>
</html>