【问题标题】:Sort an array in a for loop and fill a new array with the sorted values在 for 循环中对数组进行排序,并用排序后的值填充新数组
【发布时间】:2013-07-09 14:25:26
【问题描述】:

我有一个数组$items,其中包含很多信息: 名称、尺寸、数量、颜色、编号... 我正在使用“for”循环按颜色对$items 值进行排序,并将排序后的值保存在一个新数组中,但是我在生成的数组中得到的值是假的或排序不正确。

在排序$items的方式中,我先从$items创建了3个数组

    <?php
    $total = $item_number; // total count of $items iterations
    $color_list_final = array_values(array_unique($color_list)); // color list without occurrences
    $name_list_final = array_values(array_unique($name_list)); // name list without occurrences
    ?>

然后将它们作为参考与$item进行比较

    <?php
    echo 'TEST - 1 - SORT BY COLORS<br/>';

    $sorted_items = array();  // the new array to fill
    $count_sorting = array(); // will count the total of all iterations

    // SORT BY COLORS
    $countfrom0 = -1;
    for ($i = 0; $i < $color_list_count; $i++) 
    {
        $countfrom0++;
        $current_color = $color_list_final[$countfrom0];

        echo 'couleur :'.$i.' '.$current_color.'<br/>';

        //SAVING THE CURRENT COLOR GROUP VALUE IN THE NEW ARRAY
        $sorted_items[$i]['color'] = $current_color;

        $i3 = 0;
        for ($i2 = 0; $i2 <= $total; $i2++) 
        {
            //IF ITEM HAVE THE SAME COLOR THAN THE CURRENT COLOR
            if($item[$i2]['color'] == $color_list_final[$countfrom0])
            {
                echo trim($item[$i2]['name']).' - '.$item[$i2]['size'].' - '.$item[$i2]['color'].'<br/>';

                //SAVING THE ITEMS VALUES IN THE NEW ARRAY
                $line[$i3] = trim($item[$i2]['name']).' - '.$item[$i2]['size'].' - '.$item[$i2]['color'].'<br/>';
                $sorted_items[$i]['items'] = $line;

                $count_sorting[$i3] = $i3;

                $i3++;
             }
        }
        echo '---------------------------<br/>';    
    }
    echo '<br/>';
?>

所以 echo 正在显示我想要的结构

    COULEUR :0  #A0C343
    FREE BEES -  XL -  #A0C343
    FREE BEES -  M -  #A0C343
    COLOMBUS -  XS -  #A0C343
    FREE BEES -  XXXL -  #A0C343
    ---------------------------
    COULEUR :1  #FFE673
    FREE BEES -  M -  #FFE673
    ---------------------------
    COULEUR :2  #F7D8D3
    COLOMBUS -  XS -  #F7D8D3
    COLOMBUS -  S -  #F7D8D3
    ---------------------------

现在,当我在 $sorted_items 上执行 print_r 时,我按颜色 (3) 获得了正确数量的数组,但嵌套数组 $line 似乎保持了他第一个段落的大小和值,并且然后,对于其他段落,它将旧值替换为具有相同索引的新值......但是索引大于新值的旧值将与第一段保持相同。

ARRAY
(
[0] => ARRAY
    (
        [COLOR] =>  #A0C343
        [ITEMS] => ARRAY
            (
                [0] => FREE BEES -  XL -  #A0C343
                [1] => FREE BEES -  M -  #A0C343
                [2] => COLOMBUS -  XS -  #A0C343
                [3] => FREE BEES -  XXXL -  #A0C343
            )

    )

[1] => ARRAY
    (
        [COLOR] =>  #FFE673
        [ITEMS] => ARRAY
            (
                [0] => FREE BEES -  M -  #FFE673
                [1] => FREE BEES -  M -  #A0C343
                [2] => COLOMBUS -  XS -  #A0C343
                [3] => FREE BEES -  XXXL -  #A0C343
            )

    )

[2] => ARRAY
    (
        [COLOR] =>  #F7D8D3
        [ITEMS] => ARRAY
            (
                [0] => COLOMBUS -  XS -  #F7D8D3
                [1] => COLOMBUS -  S -  #F7D8D3
                [2] => COLOMBUS -  XS -  #A0C343
                [3] => FREE BEES -  XXXL -  #A0C343
            )

    )

)

有什么想法吗?

【问题讨论】:

    标签: php arrays sorting loops


    【解决方案1】:

    如果echoing 的顺序正确,则尝试使用echo 的位置处的数据填充数组。在不使用代码本身的情况下,这是一个相当长的调试线程,但也许您可以尝试转

    echo trim($item[$i2]['name']).' - '.$item[$i2]['size'].' - '.$item[$i2]['color'].'<br/>';
    

    进入

    $array[$i2] = array(  'name'  => trim($item[$i2]['name'])
                       ,  'item'   => $item[$i2]['size']
                       ,  'color' => $item[$i2]['color']
                       );
    

    另外,$i3 的角色似乎有点模棱两可,所以可能要么在 for() 循环中声明它,要么完全摆脱它。

    【讨论】:

    • 首先感谢您的回答,然后抱歉耽搁了!
    • $i3 计数器只有在if 条件为真时才需要递增,这就是我单独设置它的原因。我尝试了您的建议并进行了一些修改,它以某种方式起作用(我将在几分钟内编辑我的帖子),但数组 $line 似乎保留了他的第一个段落的大小和值,然后,对于其他人段落,它将旧值替换为具有相同索引的新值...但是索引大于新值的旧值将与第一段保持相同。
    【解决方案2】:

    我在嵌套的“for”循环之后清空了数组“$line”

    $i3 = 0;
    for ($i2 = 0; $i2 <= $total; $i2++) 
    {
        //SI LA COULEUR DE L ITEM EST LA MM QUE CELLE PRECEDEMENT DEFINI
        if($item[$i2]['color'] == $color_list_final[$countfrom0])
        {
            echo trim($item[$i2]['name']).' - '.$item[$i2]['size'].' - '.$item[$i2]['color'].'<br/>';
    
            $line[$i3] = trim($item[$i2]['name']).' - '.$item[$i2]['size'].' - '.$item[$i2]['color'];
            $sorted_items[$i]['items'] = $line;
    
            $count_sorting[$i3] = $i3;
    
            $i3++;
        }
    }
    $line = array();
    

    它给了我想要的东西

    ARRAY
    (
    [0] => ARRAY
        (
            [COLOR] =>  #A0C343
            [ITEMS] => ARRAY
                (
                    [0] => FREE BEES -  XL -  #A0C343
                    [1] => FREE BEES -  M -  #A0C343
                    [2] => COLOMBUS -  XS -  #A0C343
                    [3] => FREE BEES -  XXXL -  #A0C343
                )
    
        )
    
    [1] => ARRAY
        (
            [COLOR] =>  #FFE673
            [ITEMS] => ARRAY
                (
                    [0] => FREE BEES -  M -  #FFE673
                )
    
        )
    
    [2] => ARRAY
        (
            [COLOR] =>  #F7D8D3
            [ITEMS] => ARRAY
                (
                    [0] => COLOMBUS -  XS -  #F7D8D3
                    [1] => COLOMBUS -  S -  #F7D8D3
                )
    
        )
    
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多