如何通过迭代删除数组中的所有元素

时间:2017-05-26 18:53:07

标签: php arrays iteration

我有一个包含数组的数组$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)的大小总是开始时的一半。

我希望它是空的 //在结束时

为什么我只删除了数组中一半的元素?

提前谢谢大家。

5 个答案:

答案 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)

问题根源在于将$isizeof($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

https://3v4l.org/N2p3v