【问题标题】:If statement has to check if the id is already used if yes add to it, if no make it. Makes multiple times same idIf 语句必须检查 id 是否已被使用,如果是则添加,如果没有则添加。多次生成相同的 id
【发布时间】:2019-11-11 21:08:45
【问题描述】:

我正在尝试使用链接到街道名称的表单创建一个数组。为了确保表单只添加到数组中一次,我循环遍历它。根据表单 id,我可以将 id、名称、百分比和街道添加到数组 $projectForms 中,或者仅在 $projectForms 中已经存在 id 时添加街道。

代码:

$projectForms = [
        'projectName' => $projectName,
        'forms' => []
    ];

    foreach ($houses as $house) {
        foreach ($house['forms'] as $form) {

            if (!$projectForms['forms']) {
                array_push($projectForms['forms'], array('id' => $form['id'], 'name' => $form['name'], 'percentage' => $form['percentage'], 'streets' => array($house['fullStreet'])));
            } else {
                foreach ($projectForms['forms'] as $key => $value) {
                    if ($projectForms['forms'][$key]['id'] === $form['id']) {
                        array_push($projectForms['forms'][$key]['streets'], $house['fullStreet']);
                    } else if ($projectForms['forms'][$key]['id'] !== $form['id']) {
                        array_push($projectForms['forms'], array('id' => $form['id'], 'name' => $form['name'], 'percentage' => $form['percentage'], 'streets' => array($house['fullStreet'])));
                    }
                }
            }
        }
    }
    dd($projectForms['forms']);
    //Return to the view
    dd($projectForms);
    return view('example')->with(['projectForms' => $projectForms]);

dd $houses:

array:6 [▼
  0 => array:3 [▼
    "id" => 97641
    "fullStreet" => "SomeStreet 1"
    "forms" => array:1 [▼
      0 => array:3 [▼
        "id" => 2456
        "name" => "Some name"
        "percentage" => 6.6666666666667
      ]
    ]
  ]
  1 => array:3 [▼
    "id" => 97642
    "fullStreet" => "SomeStreet 2"
    "forms" => array:1 [▼
      0 => array:3 [▼
        "id" => 2456
        "name" => "Some Name"
        "percentage" => 6.6666666666667
      ]
    ]
  ]
  2 => array:3 [▼
    "id" => 97643
     "fullStreet" => "SomeStreet 3"
     "forms" => array:1 [▼
      0 => array:3 [▼
        "id" => 2456
        "name" => "Some Name"
        "percentage" => 6.6666666666667
      ]
    ]
  ]
  3 => array:3 [▼
    "id" => 97644
    "fullStreet" => "SomeStreet 4"
    "forms" => array:1 [▼
      0 => array:3 [▼
        "id" => 2456
        "name" => "Some Name"
        "percentage" => 6.6666666666667
      ]
    ]
  ]
   4 => array:3 [▼
    "id" => 97645
    "fullStreet" => "SomeStreet 5"
    "forms" => array:1 [▼
      0 => array:3 [▼
        "id" => 2489
        "name" => "Some name"
        "percentage" => 3.3333333333333
      ]
    ]
  ]
  5 => array:3 [▼
    "id" => 97646
    "fullStreet" => "SomeStreet 6"
    "forms" => array:1 [▼
      0 => array:3 [▼
        "id" => 2489
        "name" => "Some Name"
        "percentage" => 3.3333333333333
      ]
    ]
  ]
]

完成后添加 $projectForms:

array:3 [▼
  0 => array:4 [▼
    "id" => 2456
    "name" => "Some Name"
    "percentage" => 6.6666666666667
    "streets" => array:4 [▼
      0 => "Some Street 1"
      1 => "Some Street 2"
      2 => "Some Street 3"
      3 => "Some Street 4"
    ]
  ]
  1 => array:4 [▼
    "id" => 2489
    "name" => "Some Name"
    "percentage" => 3.3333333333333
    "streets" => array:2 [▼
      0 => "Some Street 5"
      1 => "Some Street 6"
    ]
  ]
  2 => array:4 [▼
    "id" => 2489
    "name" => "Some Name"
    "percentage" => 3.3333333333333
    "streets" => array:1 [▼
       0 => "Some Street 6"
    ]
  ]
]

所以你可以在 $projectForms 的 dd 中看到 Some Street 6 被添加了两次,即使之前使用了 id。我想知道我可以做些什么来让我的代码只添加一次。

【问题讨论】:

  • 您在最里面的 foreach 循环中的逻辑似乎没有什么意义。您循环遍历 所有 已经存在的条目,并在 每次迭代 中创建一个 array_push,在 if- 或 else-branch 中 - 因此您插入了尽可能多的新元素就像当时在$projectForms['forms'] 中一样,在一个你应该只插入一个的地方。
  • @04FS 我现在看到了。这能解释为什么最后添加 Some Street 6 吗?
  • 是的。当您处理最后一个数据项时,您的结果数组已经包含两个条目,分别为 id 2456 和 2489。您正在循环它们。在第一次迭代中,您要添加的 id (2489) 与您当前循环的 id 2456 不同 - 因此街道 6 作为新元素添加到您的输出数组中。在下一次迭代中,ID 确实匹配 - 因此您现在将街道 6 添加到第二个元素。
  • @04FS ooooohhhhhhh。非常感谢。如果您可以添加我可以接受的答案,以便您获得代表:)

标签: php laravel if-statement


【解决方案1】:

您在最里面的 foreach 循环中的逻辑已关闭。您遍历 所有 已经存在的条目,并且在每次迭代中,您在 if- 或 else-branch 中创建一个 array_push - 因此您在这里插入的新元素与 $projectForms 中已有的一样多['forms'] 那个时候,在一个你应该只插入一个的地方。

这能解释为什么最后添加 Some Street 6 吗?

是的。当您处理最后一个数据项时,您的结果数组已经包含两个条目,ID 为 2456 和 2489。您正在循环它们。在第一次迭代中,您要添加的 id (2489) 与您当前循环的 id 2456 不同 - 因此街道 6 作为新元素添加到您的输出数组中。在下一次迭代中,ID 确实匹配 - 因此您现在将街道 6 添加到第二个元素。


在您的内部循环中,您需要将当前项目添加到具有匹配 id 的现有元素中,如果您找到了这样的项目。如果是这样,你可以在那个时候跳出循环,没有什么可做的了。如果没有,您需要在循环之后将项目添加为新元素。使用标志来确定是否仍然需要发生这种情况。伪代码:

$id_found = false;
foreach(loop over already existing elements in result array) {
  if( ids match ) {
    $id_found = true;
    // add item to existing element
    // ...
    break;
  }
}
if( !$id_found ) {
  // add item as new element
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-11
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多