-4

Data

    Array
        (
            [0] => Array
                (
                    [name] => USPS First Class Package (2 To 3 business days)
                    [value] => USPSFirstClass
                    [category] => STANDARD
                )

            [1] => Array
                (
                    [name] => USPS Priority Mail (1 To 3 business days)
                    [value] => USPSPriority
                    [category] => EXPEDITED
                )

            [2] => Array
                (
                   [name] => FedEx Ground or FedEx Home Delivery (1 To 5 
 business days)
                   [value] => FedExHomeDelivery
                   [category] => STANDARD
        )

            [3] => Array
              (
                  [name] => UPS Ground (1 To 5 business days)
                  [value] => UPSGround
                  [category] => EXPEDITED
              )

        )

Question: The above data I want to loop it as a dropdown list with optgroup label. The dropdown data will be show as

STANDARD

USPS First Class Package (2 To 3 business days)

FedEx Ground or FedEx Home Delivery (1 To 5 business days)

EXPEDITED

USPS Priority Mail (1 To 3 business days)

UPS Ground (1 To 5 business days)

How can I do that :(

3

4 Answers 4

0

You can do the following:

<?php

$data = array(
    array(
        'name' => 'USPS First Class Package (2 To 3 business days)',
        'value' => 'USPSFirstClass',
        'category' => 'STANDARD'
    ),
    array(
        'name' => 'USPS Priority Mail (1 To 3 business days)',
        'value' => 'USPSPriority',
        'category' => 'EXPEDITED'
    ),
    array(
        'name' => 'FedEx Ground or FedEx Home Delivery (1 To 5 business days)',
        'value' => 'FedExHomeDelivery',
        'category' => 'STANDARD'
    ),
    array(
        'name' => 'UPS Ground (1 To 5 business days)',
        'value' => 'UPSGround',
        'category' => 'EXPEDITED'
    ),
);

Sort your categories into one array:

$sorted = array();
foreach ($data as $key => $value){
    $sorted[$value['category']][] = array($value['name'], $value['value']);
}

and loop through it:

echo "<select>";
foreach ($sorted as $key => $value){
    echo "<optgroup label='$key'>";
    foreach ($value as $v){
        echo "<option value='". $v[1]."'>". $v[0] ."</option>";
    }
    echo "</optgroup>";
}
echo "</select>";

?>
Sign up to request clarification or add additional context in comments.

Comments

0

Something like this

<?php
$data = [
    [
        'name' => 'USPS First Class Package (2 To 3 business days)',
        'value' => 'USPSFirstClass',
        'category' => 'STANDARD'
    ],
    [
        'name' => 'USPS Priority Mail (1 To 3 business days)',
        'value' => 'USPSPriority',
        'category' => 'EXPEDITED'
    ],
    [
        'name' => 'FedEx Ground or FedEx Home Delivery (1 To 5
 business days)',
        'value' => 'FedExHomeDelivery',
        'category' => 'STANDARD'
    ],
    [
        'name' => 'UPS Ground (1 To 5 business days)',
        'value' => 'UPSGround',
        'category' => 'EXPEDITED'
    ]
];

function _group_by($array, $key)
{
    $return = array();
    foreach ($array as $val) {
        $return[$val[$key]][] = $val;
    }

    return $return;
}

$result = _group_by($data, 'category');
?>

<select>
    <?php foreach ($result as $key => $value): ?>
        <optgroup label="<?php echo $key ?>">
            <?php foreach ($value as $v): ?>
                <option value="<?php echo $v['value'] ?>"><?php echo $v['name'] ?></option>
            <?php endforeach; ?>
        </optgroup>
    <?php endforeach; ?>
</select>

this _group_by function separate your array based on your key

Comments

0

You could also try this:

1)Create array for standard and expedited values

$standard=array();
$expedited=array();

2)Loop through your arrays

foreach($array_1 as $k=>$v) {
    if($v['category'] == 'STANDARD'){
        array_push($standard,$v['name']);
    }
    if($v['category'] == 'EXPEDITED'){
        array_push($expedited,$v['name']);
    }
}

3)Print what you need

print("STANDARD");
print nl2br("\n");
foreach($standard as $s){
    print_r($s);
    print nl2br("\n");
}

print nl2br("\n");
print("EXPEDITED");
print nl2br("\n");
foreach($expedited as $e){
    print($e);
    print nl2br("\n");
}

Final output will be:

STANDARD
USPS First Class Package (2 To 3 business days)
FedEx Ground or FedEx Home Delivery (1 To 5 )

EXPEDITED
USPS Priority Mail (1 To 3 business days)
UPS Ground (1 To 5 business days)

Comments

-1

You can sort it by category using array_multisort function

and then loop through.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.