Php 如何在循环本身内部取消设置foreach循环主数组(正在迭代的那个数组)?

Php 如何在循环本身内部取消设置foreach循环主数组(正在迭代的那个数组)?,php,foreach,Php,Foreach,我有两个foreach循环,如下所示 我们的想法是先处理类型2,然后再处理类型1。下面的代码工作正常,但我想知道如何使用unset来获得相同的结果,而不是使用另一个数组$processed来跟踪处理的内容 我知道PHP foreach克隆/复制$data数组以进行迭代。换句话说,是否可以在第二个foreach循环中从$data取消设置类型2,并以某种方式在第一个foreach循环中跳过它们 我知道PHP foreach克隆/复制数组以进行迭代 $data = array( array

我有两个
foreach
循环,如下所示

我们的想法是先处理类型2,然后再处理类型1。下面的代码工作正常,但我想知道如何使用unset来获得相同的结果,而不是使用另一个数组$processed来跟踪处理的内容

我知道PHP foreach克隆/复制
$data
数组以进行迭代。换句话说,是否可以在第二个
foreach
循环中从
$data
取消设置
类型2,并以某种方式在第一个
foreach
循环中跳过它们

我知道PHP foreach克隆/复制数组以进行迭代

  $data = array(
    array('type' => 1),
    array('type' => 2),
    array('type' => 2),
    array('type' => 2),
    array('type' => 1),
    array('type' => 2),
    array('type' => 2),
);

$processed = array();
foreach ($data as $firstKey => $firstValue) {

    if (in_array($firstKey, $processed)) {
        continue;
    }

    foreach ($data as $secondKey => $secondValue) {
        if ($secondValue['type'] == 2) {
            echo $secondValue['type'] . " processed " . "<br/>";
            $processed[] = $secondKey; // can I use unset here?
        }
    }

    echo $firstValue['type'] . " processed" . "<br/>";
}
以上代码输出:

2- child 1 processed 
3- child 2 processed 
4- child 3 processed 
1- parent 1 processed
6- child 1 processed 
7- child 2 processed 
5- parent 2 processed
9- child 1 processed 
10- child 2 processed 
8- parent 3 processed

这里有一个更简单的版本,不需要任何不稳定的东西。它只是测试类型。对于每个类型1条目,它首先处理所有类型2条目,然后处理该类型1条目

<?php

$data = array(
              array('type' => 1),
              array('type' => 2),
              array('type' => 2),
              array('type' => 2),
              array('type' => 1),
              array('type' => 2),
              array('type' => 2),
              );

foreach ($data as $firstKey => $firstValue) {
    if ($firstValue['type'] == 1) {
        foreach ($data as $secondKey => $secondValue) {
            if ($secondValue['type'] == 2) {
                echo $secondValue['type'] . " processed " . "<br/>";
            }
        }
        echo $firstValue['type'] . " processed" . "<br/>";
    }
}

重做我的答案以与OP的更新问题相匹配

下面是使用递归函数实现类似输出的一种方法

function processData(&$data, $ref = null)
{
    foreach ($data as $key => $value) {
        if ($ref !== null && $value['ref'] !== $ref) {
            continue;
        }
        $data = processData($data, $value['id']);
        echo $value['id'] . "- " . $value['name'] . " processed" . "<br/>";
        unset($data[$key]);
    }

    return $data;
}

processData($data);
函数processData(&$data,$ref=null)
{
foreach($key=>$value形式的数据){
如果($ref!==null&&$value['ref']!==ref){
持续
}
$data=processData($data,$value['id']);
echo$value['id']。“-”$value['name']”已处理。“
”; 未设置($data[$key]); } 返回$data; } processData($数据);

不过,此函数将修改数组,在数组运行时不断取消元素设置。

是否确实要在第一个循环中执行第二个循环,而不是在第一个循环之后执行?是的,可以使用
unset($data[$firstKey])。你试过了吗?你有什么问题吗?等等,根据你更新的问题,你想在1之前先处理2,然后在3之前处理4?处理订单背后的逻辑是什么?4s也比2s先到吗?3个怎么样,它们在2个之前得到处理吗?我删除了我的更新。这里很难为真正的应用程序提供伪示例。请忽略更新!我明白了你想对原始问题做什么,与之前的编辑不太一样,但看起来你总是想先处理编号较高的类型。那么,排序对您来说不是一个选项吗?需要按顺序进行处理:所有2个,然后1个,然后2个,然后1个。我可以通过排序实现您编写的代码。你的代码处理所有的1和2是分开的,不是按照我想要的顺序。我不明白。我先处理所有2,然后处理所有1。你不是这么说的吗?您的意思是,对于每个2,您希望处理所有1吗?您是否可以更新问题以显示所需的输出?
foreach ($dataType1 as $firstValue) {
    foreach ($dataType2 as $secondValue) {
        echo $secondValue['type'] . " processed " . "<br/>";
    }
    echo $firstValue['type'] . " processed" . "<br/>";
}
function processData(&$data, $ref = null)
{
    foreach ($data as $key => $value) {
        if ($ref !== null && $value['ref'] !== $ref) {
            continue;
        }
        $data = processData($data, $value['id']);
        echo $value['id'] . "- " . $value['name'] . " processed" . "<br/>";
        unset($data[$key]);
    }

    return $data;
}

processData($data);