Mike M
Mike M

Reputation: 33

Creating Multidimensional array from textbox and checkbox values

I'm hoping to solve a problem with a baseball team! ;)

I've a form with multiple textboxes - each of which has a series of checkboxes associated with it. To get a better feel, create a file with the following, and open in a browser. A picture speaks a thousand words.

<html>
<head></head>
<body>
        <h2>Enter Player Name and Positions They Can Play:</h2>
                        <form name="player" method="POST">

                <p>Player 01: <input type="text" name="p1" value="" />
                | P <input type="checkbox" name="pitch1" value="P" />
                | C <input type="checkbox" name="catch1" value="C" />
                | 1B <input type="checkbox" name="first1" value="1B" />
                | 2B <input type="checkbox" name="second1" value="2B" />
                | SS <input type="checkbox" name="short1" value="SS" />
                | 3B <input type="checkbox" name="third1" value="3B" /> |</p>

                <p>Player 02: <input type="text" name="p2" value="" />
                | P <input type="checkbox" name="pitch2" value="P" />
                | C <input type="checkbox" name="catch2" value="C" />
                | 1B <input type="checkbox" name="first2" value="1B" />
                | 2B <input type="checkbox" name="second2" value="2B" />
                | SS <input type="checkbox" name="short2" value="SS" />
                | 3B <input type="checkbox" name="third2" value="3B" /> |</p>

                <p>Player 03: <input type="text" name="p3" value="" />
                | P <input type="checkbox" name="pitch3" value="P" />
                | C <input type="checkbox" name="catch3" value="C" />
                | 1B <input type="checkbox" name="first3" value="1B" />
                | 2B <input type="checkbox" name="second3" value="2B" />
                | SS <input type="checkbox" name="short3" value="SS" />
                | 3B <input type="checkbox" name="third3" value="3B" /> |</p>
    <p><input type="submit" value="Submit" name="Submit" /></p>
    </form>
</body>
</html>

So, if a user typed in:

"Fred" and checked 1B, SS, 3B (first base and shortstop)

"Ted" and checked P, 2B (pitcher and second base)

"Joe" and checked P, 3B (pitcher and third base)

On submit, I'd like to see the following array (named roster, with sub-arrays named from the textbox entry and the sub-array contents only the checked values:

roster(

Fred(1B,SS,3B),

Ted(P,2B),

Joe(P,3B)

)

I'm confident I can handle everything beyond this... I'm just having a devil of a time figuring out how to create each sub array and associating them with the textboxes and adding the checkbox values to each array.

Any help is much appreciated! Thank you!

Upvotes: 3

Views: 3210

Answers (2)

The Alpha
The Alpha

Reputation: 146201

You may try this but it's better to use what Casimir et Hippolyte recommended.

if( isset($_POST['Submit']) )
{
    $players = $_POST['players'];
    $items = array('pitch', 'catch', 'first', 'second', 'short', 'third');
    $roaster = array();
    $i=1;
    foreach($players as $player)
    {
        if(!$player) continue;
        $roaster[$player]=array();
        foreach($items as $item)
        {
            if( isset( $_POST[$item.$i] ) ) $roaster[$player][] = $_POST[$item.$i];
        }
        $i++;
    }
    $roaster = array_filter( $roaster );
}

Just make some changes in your form as follows

Player 01: <input type="text" name="players[]" value="" />
...
Player 02: <input type="text" name="players[]" value="" />
...
Player 03: <input type="text" name="players[]" value="" />
...

Upvotes: 0

Casimir et Hippolyte
Casimir et Hippolyte

Reputation: 89557

It's not exactly what you asked, but a better way to manage this kind of forms is to choose vars names like this:

<p>Player 01: <input type="text" name="player[1][name]" value="" />
     | P <input type="checkbox" name="player[1][pitch]" value="P" />
            | C <input type="checkbox" name="player[1][catch]" value="C" />
            | 1B <input type="checkbox" name="player[1][first]" value="1B" />
            | 2B <input type="checkbox" name="player[1][second]" value="2B" />
            | SS <input type="checkbox" name="player[1][short]" value="SS" />
            | 3B <input type="checkbox" name="player[1][third]" value="3B" /> |</p>

            <p>Player 02: <input type="text" name="player[2][name]" value="" />
            | P <input type="checkbox" name="player[2][pitch]" value="P" />
            | C <input type="checkbox" name="player[2][catch]" value="C" />
            ...

You will obtain something like that:

Array
(
    [player] => Array
    (
        [1] => Array
        (
            [name] => Marcel
            [pitch] => P
            [short] => SS
            [third] => 3B
        )
        [2] => Array
        (
            [name] => Auguste
            [catch] => C
            [first] => 1B
        )
        [3] => Array
        (
            [name] => Ulysse
            [catch] => C
            [second] => 2B
        )
    )
)

Then, you can easily access each element of each player:

$players = $_POST['player'];

echo $players[1]['name'] . '<br/>';

or you can construct this kind of array:

foreach($players as $key=>$player) {
    $temp[] = $player['name'];
    unset($player['name']);
    $temp[] = $player;
    $result[] = $temp;
    unset($temp);
}
print_r($result);

Upvotes: 3

Related Questions