【问题标题】:How to loop over associative array using foreach loop construct in following scenairo?如何在以下场景中使用 foreach 循环构造循环关联数组?
【发布时间】:2014-06-23 19:03:09
【问题描述】:

我有一个名为 $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 循环遍历这种数组?

【问题讨论】:

  • 是的,我们可以看到有些是数组,有些不是,那么目标是什么?循环它们,接下来会发生什么?请澄清您的问题并提供目标和最终结果
  • @kevinabelita:我想访问每个值并使用 foreach 循环打印它们。

标签: php arrays foreach associative-array key-value


【解决方案1】:

如果您只想打印每一个,只需使用 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/>";
}

【讨论】:

  • 这适用于该示例。如果有更多级别,递归可能是更好的选择。
  • 是的,它应该适用于示例,但在这个示例中使用迭代器可能会更好。我编辑它
  • @kevinabelita:感谢您的回答,但我还想要一件事,products[] 下的值应该都是不同的,而与内部数组无关(即 [1]、[2]、[3] 每个这些数组应该在它们所属的内部 [products] 数组中包含不同的值。如果找到匹配,则回显错误消息,如果没有,则回显成功消息。不允许在所有内部数组的所有 [product] 键中重复值。
  • @PHPLover products[] 数组应该包含唯一值吗?比如array[1]['products']array(1,2,3,3),显示错误?
  • @kevinabelita:是的,它必须显示错误。但我也需要其他内部数组的 [product] 键中的不同值。例如在上面的数组 9 和 8 存在于第三个数组的第三个数组中,它们是唯一的,但相同的 9 和 8 存在于第一个和第二个数组中,因此在这种情况下,它也应该回显一条错误消息。现在一切都清楚了。如果你还有什么疑问可以问我。
【解决方案2】:

我建议您使用递归方法将数组的所有条目置于同一级别,然后打印此数组:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    相关资源
    最近更新 更多