我有一个包含数组的数组$scripts_stack = [];
:
$array_item = array('script' => $file_parts, 'handle' => $file_name, 'src' => $url);
array_push($scripts_stack, $array_item);
<?php
for ($i = 0; $i < sizeof($scripts_stack); $i++) {
$child_array = $scripts_stack[$i];
if (is_array($child_array)) {
// Do things with $child_array,
// then remove the child array from $scripts_stack when done with (BELOW)
unset($scripts_stack[$i]);
}
}
echo "Array Size : " . (sizeof($scripts_stack)); // AT THE END
但是,我的attemts只删除了一半的元素。无论我尝试什么,它只有一半被删除的项目。 sizeof($scripts_stack)
的大小总是开始时的一半。
我希望它是空的 //在结束时
为什么我只删除了数组中一半的元素?
提前谢谢大家。
答案 0 :(得分:2)
正如其他答案所述,$i
递增,但数组sizeof()
缩小。 foreach()
可能是数组中最灵活的循环,因为它暴露了实际的键(而不是希望它从0开始并以1递增)和值:
foreach ($scripts_stack as $key => $child_array) {
if (is_array($child_array)) {
// Do things with $child_array,
// then remove the child array from $scripts_stack when done with (BELOW)
unset($scripts_stack[$key]);
}
}
答案 1 :(得分:2)
仅供参考,您使用for
几乎的方式正常运作。您只需要在循环定义之前建立计数,而不是在延续条件中重新计算。
$count = sizeof($scripts_stack);
for ($i = 0; $i < $count; $i++) { // ...
不过,我认为最好只使用其他类型的循环,如其他答案中所示。我亲自去foreach
,因为它应该总是迭代每个元素,即使某些索引不存在。 (按照你构建数组的方式,看起来索引应该总是顺序的。)
另一种可能性是将元素从数组中移除而不是明确地取消它们。
while ($child_array = array_shift($scripts_stack)) {
// Do things with $child_array,
}
但这肯定会删除数组中的每个元素。看起来$child_array
应该始终是一个数组,因此is_array($child_array)
可能没有必要,但是如果还有更多我们在这里看不到的东西,并且有一些你需要保留的非数组元素,然后这不会起作用。
答案 2 :(得分:1)
在数组收缩时你提升$i
,但同时跳过数组中的项目。
第一个循环是$i == 0
,然后当你删除数组中的第0个项目时,第二个位置的项目已移至第一位,而$i ==
(所以你不会删除当前第一个位置的项目,依此类推。
您可以使用while
代替for
循环:
<?php
$i = 0;
while ($i < sizeof($scripts_stack)) {
$child_array = $scripts_stack[$i];
if (is_array($child_array)) {
// Do things with $child_array,
// then remove the child array from $scripts_stack when done with (BELOW)
unset($scripts_stack[$i]);
} else {
$i++;
}
}
echo "Array Size : " . (sizeof($scripts_stack)); // AT THE END
答案 3 :(得分:0)
可能你可以使用这个脚本。它没有经过测试。
import UIKit
@IBDesignable
class Dot:UIView
{
@IBInspectable var mainColor: UIColor = UIColor.clear
{
didSet { print("mainColor was set here") }
}
@IBInspectable var ringColor: UIColor = UIColor.clear
{
didSet { print("bColor was set here") }
}
@IBInspectable var ringThickness: CGFloat = 4
{
didSet { print("ringThickness was set here") }
}
@IBInspectable var isSelected: Bool = true
override func draw(_ rect: CGRect)
{
let dotPath = UIBezierPath(ovalIn: rect)
let shapeLayer = CAShapeLayer()
shapeLayer.path = dotPath.cgPath
shapeLayer.fillColor = mainColor.cgColor
layer.addSublayer(shapeLayer)
if (isSelected) { drawRingFittingInsideView(rect: rect) }
}
internal func drawRingFittingInsideView(rect: CGRect)->()
{
let halfSize:CGFloat = min( bounds.size.width/2, bounds.size.height/2)
let desiredLineWidth:CGFloat = ringThickness // your desired value
let circlePath = UIBezierPath(
arcCenter: CGPoint(x: halfSize, y: halfSize),
radius: CGFloat( halfSize - (desiredLineWidth/2) ),
startAngle: CGFloat(0),
endAngle:CGFloat(Double.pi),
clockwise: true)
let shapeLayer = CAShapeLayer()
shapeLayer.path = circlePath.cgPath
shapeLayer.fillColor = UIColor.clear.cgColor
shapeLayer.strokeColor = ringColor.cgColor
shapeLayer.lineWidth = ringThickness
layer.addSublayer(shapeLayer)
}
}
我希望,它会对你有帮助。
答案 4 :(得分:-3)
问题根源在于将$i
与sizeof($scripts_stack)
进行比较。进一步sizeof($scripts_stack)
的每一步都变得更低(它在每一步计算)并且$i
变得更高。
解决方法可能如下所示:
<?php
$scripts_stack = [];
$array_item = array('script' => 1, 'handle' => 2, 'src' => 3);
array_push($scripts_stack, $array_item);
array_push($scripts_stack, $array_item);
array_push($scripts_stack, $array_item);
array_push($scripts_stack, $array_item);
array_push($scripts_stack, $array_item);
while (sizeof($scripts_stack) > 0) {
$child_array = array_shift($scripts_stack);
if (is_array($child_array)) {
// Do things with $child_array,
// then remove the child array from $scripts_stack when done with (BELOW)
}
}
echo "Array Size : " . (sizeof($scripts_stack)); // AT THE END