Unknown Error
Unknown Error

Reputation: 797

Print option tags with optgroup tags from a sorted 2d array

Example my array

$options = array(
    array("brand" => "Puma","code" => "p01","name" => "Puma One"),
    array("brand" => "Puma","code" => "p02","name" => "Puma Two"),
    array("brand" => "Puma","code" => "p03","name" => "Puma Three"),
    array("brand" => "Nike","code" => "n01","name" => "Nike One"),
    array("brand" => "Nike","code" => "n02","name" => "Nike Two"),
    array("brand" => "Nike","code" => "n03","name" => "Nike Three"),
    array("brand" => "Nike","code" => "n04","name" => "Nike Four"),
    array("brand" => "Adidas","code" => "a01","name" => "Adidas One"),
    array("brand" => "Adidas","code" => "a02","name" => "Adidas Two"),
    array("brand" => "Adidas","code" => "a03","name" => "Adidas Three"),
    array("brand" => "Adidas","code" => "a04","name" => "Adidas Four"),
    array("brand" => "Adidas","code" => "a05","name" => "Adidas Five"),
    array("brand" => "Adidas","code" => "a06","name" => "Adidas Six")
);

How to generate this array to be

<select name="products" id="products">
  <optgroup label="Puma">
  <option value="p01">Puma One</option>
  <option value="p02">Puma Two</option>
  <option value="p03">Puma Three</option>
  </optgroup>
  .......
  <optgroup label="Adidas">
  <option value="a01">Adidas One</option>
  <option value="a02">Adidas Two</option>
  <option value="a03">Adidas Three</option>
  .......
  </optgroup>
</select>

Or you can suggestion better array according to my select option output. Let me know.

Upvotes: 6

Views: 20928

Answers (1)

casablanca
casablanca

Reputation: 70701

You can create another array keyed by the brand:

$newOptions = array();
foreach ($options as $option) {
  $brand = $option['brand'];
  $code = $option['code'];
  $name = $option['name'];

  $newOptions[$brand][$code] = $name;
}

This will produce an array like this:

$newOptions = array(
  'Puma' => array('p01' => 'Puma One', 'p02' => 'Puma Two'),
  'Nike' => array('n01' => 'Nike One', 'n02' => 'Nike Two'),
  ...
);

If you can directly format your array like this, you can skip the first step.

Then iterate over this new array and output the options:

foreach ($newOptions as $brand => $list) {
  echo "<optgroup label=\"$brand\">\n";
  foreach ($list as $code => $name)
    echo "<option value=\"$code\">$name</option>\n";
  echo "</optgroup>\n";
}

Upvotes: 12

Related Questions