Как зациклить ассоциативный массив с помощью конструкции цикла foreach в следующем сценарии?

У меня есть массив под названием $rebate_by_product:

Array
(
    [op] => preview
    [id] => 
    [form_submitted] => yes
    [company_id] => 46
    [1] => Array
        (
            [pack] => 10
            [quantity] => 20
            [volume] => 30
            [units] => 9
            [amount] => 40
            [rebate_start_date] => 2014-05-01
            [rebate_expiry_date] => 2014-05-05
            [applicable_states] => Array
                (
                    [0] => 1
                    [1] => 2
                    [2] => 3
                )

            [rebate_total_count] => 5000
            [products] => Array
                (
                    [1] => 9
                    [2] => 10
                )

        )

    [2] => Array
        (
            [pack] => 50
            [quantity] => 60
            [volume] => 70
            [units] => 10
            [amount] => 80
            [rebate_start_date] => 2014-05-06
            [rebate_expiry_date] => 2014-05-10
            [applicable_states] => Array
                (
                    [0] => 14
                    [1] => 15
                    [2] => 16
                )

            [rebate_total_count] => 10000
            [products] => Array
                (
                    [1] => 11
                    [2] => 8
                )

        )

    [3] => Array
        (
            [pack] => 100
            [quantity] => 200
            [volume] => 300
            [units] => 7
            [amount] => 400
            [rebate_start_date] => 2014-05-21
            [rebate_expiry_date] => 2014-05-30
            [applicable_states] => Array
                (
                    [0] => 26
                    [1] => 33
                    [2] => 42
                )

            [rebate_total_count] => 9999
            [products] => Array
                (
                    [1] => 9
                    [2] => 8
                )

        )

    [multiselect] => 42
)

Вы можете наблюдать из массива выше, что он имеет несколько элементов, которые не являются массивами, но у него есть три таких элемента, которые сами являются массивами, и даже немногие из его элементов данных также являются массивами, так как зациклить этот тип массива с помощью цикла foreach?

2 ответа

Решение

Если вы просто хотите напечатать каждый из них, просто используйте цикл foreach. Рассмотрим этот пример:

$product_keys = array(); // edited
// loop them, if its an array, loop inside it again
foreach($rebate_by_product as $index => $element) {
    if(is_array($element)) {
        foreach($element as $key => $value) {
            if(is_array($value)) {

                // EDITED
                if($key == 'products') {
                    $product_keys = array_merge($product_keys, $value);
                }

                $value = implode(',', $value);
                echo "$key => $value <br/>";
            } else {
                echo "$key => $value <br/>";
            }
        }
    } else {
        echo "$index => $element <br/>";
    }
}

// if product items has duplicates check here (edited)
if(count($product_keys) != count(array_unique($product_keys))) {
    echo "<script>alert('This array has duplicate products');</script>";
} else {
    echo "<script>alert('Products are ok');</script>";
}

Или, если вы хотите, вы не можете просто использовать iterators на этом:

$recursive = new RecursiveIteratorIterator(new RecursiveArrayIterator($rebate_by_product));
foreach($recursive as $key => $value) {
    echo "$key => $value <br/>";
}

Я бы предложил вам использовать рекурсивный подход, чтобы привести все записи массива на один уровень, а затем распечатать этот массив:

function loopArray($inputVal,$inputKey = "") {
    if(is_array($inputVal)) {
        $output = array();
        foreach($inputVal as $key => $value) {
            $output = array_merge($output,loopArray($value,$key));
        }
        return $output;
    } else {
        return array($inputKey => $inputVal);   
    }
}

// Just for presenting:
$yourArray = array(
    "1" => "1",
    array(
        "2.1" => "2.1",
        array(
            "2.2.1" => "2.2.1"
        )
    ),
    "3" => "3",
    array(
        "4.1" => "4.1"
    )
);

$newArray = loopArray($yourArray);
// > array("1" => 1,"2.1" => "2.1","2.2.1" => "2.2.1","3" => "3","4.1" => "4.1")

foreach($newArray as $key => $value) {
    echo $key." => ".$value."<br/>";   
}
// > 1 => 1
// > 2.1 => 2.1
// > 2.2.1 => 2.2.1
// > 3 => 3
// > 4.1 => 4.1
Другие вопросы по тегам