用条件交换数组项


Swap array Item with condition

我有交换数组条件的情况。我的数组如下图所示。

  • pid =>像mysql的主键,所以它可能会丢失命令
  • type=> type表示产品类型。包含3种产品的数组。
  • Name=>简写产品名称

首先我尝试解决mysql,但我没有得到任何好的迹象。其中一些建议我数组交换是更好的一个。但是我不知道如何得到这个。

<标题> 我的问题

我有一个项目列表。当我列出产品时,类型3(物质)不应该出现在5、10、15(即5个模块)的位置。如果我的设计崩溃了

截屏说明

  1. 完美放置
  2. 崩溃的设计

所以我想确保type 3(master)永远不会出现在mod(5)的位置。我该怎么做呢帮我

我以前的尝试在mysql这里

    Array
    (
        [0] => Array
            (
                [pid] => 1
                [type] => 1
                [name] => A
            )
    [1] => Array
        (
            [pid] => 2
            [type] => 1
            [name] => B
        )
    [2] => Array
        (
            [pid] => 3
            [type] => 2
            [name] => D
        )
    [3] => Array
        (
            [pid] => 4
            [type] => 3
            [name] => E(master)
        )
    [4] => Array
        (
            [pid] => 5
            [type] => 3
            [name] => f(sub)
        )
    [5] => Array
        (
            [pid] => 6
            [type] => 1
            [name] => A1
        )
    [6] => Array
        (
            [pid] => 7
            [type] => 2
            [name] => B1
        )
    [7] => Array
        (
            [pid] => 8
            [type] => 1
            [name] => C1
        )
    [8] => Array
        (
            [pid] => 9
            [type] => 2
            [name] => D1
        )
    [9] => Array
        (
            [pid] => 10
            [type] => 3
            [name] => E1(master)
        )
    [10] => Array
        (
            [pid] => 11
            [type] => 3
            [name] => A2(sub)
        )
    [11] => Array
        (
            [pid] => 12
            [type] => 2
            [name] => B2
        )
    [12] => Array
        (
            [pid] => 13
            [type] => 1
            [name] => C2
        )
    [13] => Array
        (
            [pid] => 14
            [type] => 2
            [name] => D2
        )
    [14] => Array
        (
            [pid] => 15
            [type] => 1
            [name] => E2
        )

)

Thanks in advance

我尝试了一下,下面的代码应该可以做到。我建议将一个块分成几个子部分来定义一个块。此外,它不是非常DRY的代码,但它会给你一个想法:

<?php
$grid = array(); $blocks = array();
$blocks[] = array(array("pid" => 1, "type" => 1, "name" => "A")); 
$blocks[] = array(array("pid" => 2, "type" => 1, "name" => "B")); 
$blocks[] = array(array("pid" => 3, "type" => 2, "name" => "D")); 
$blocks[] = array(array("pid" => 4, "type" => 3, "name" => "E(master)"), array("pid" => 5, "type" => 3, "name" => "F (sub)")); 
$blocks[] = array(array("pid" => 6, "type" => 1, "name" => "A1")); 
$blocks[] = array(array("pid" => 7, "type" => 2, "name" => "B1")); 
$blocks[] = array(array("pid" => 8, "type" => 1, "name" => "C1")); 
$blocks[] = array(array("pid" => 9, "type" => 2, "name" => "D1")); 
$blocks[] = array(array("pid" => 10, "type" => 3, "name" => "E1 (master)"), array("pid" => 11, "type" => 3, "name" => "A2 (sub)")); 
$blocks[] = array(array("pid" => 12, "type" => 2, "name" => "B2")); 
$blocks[] = array(array("pid" => 13, "type" => 1, "name" => "C2")); 
$blocks[] = array(array("pid" => 14, "type" => 2, "name" => "D2")); 
$blocks[] = array(array("pid" => 14, "type" => 1, "name" => "E2"));
$current_row = 0;
for ($n=0;$n < count($blocks);$n++) {
    //Check if current row exists in grid
    if (!isset($grid[$current_row]))
    {
        //Create new empty row in grid
        $grid[$current_row] = array();
    }
    //check if current block fits
    if (count($grid[$current_row]) + count($blocks[$n]) > 5)
    {
        // Block doesn't fit: Search for block that fits
        for ($i=$n;$i < count($blocks);$i++)
        {
            if (count($grid[$current_row]) + count($blocks[$i]) <= 5)
            {
                //place parts in block on current row
                foreach ($blocks[$i] as $part)
                {
                    $grid[$current_row][] = $part;
                }
                //unset block from queue
                unset($blocks[$i]);
            }
        }
        //place current block on new row
        $current_row++;
    }
    //place parts in block in grid
    foreach ($blocks[$n] as $part)
    {
        $grid[$current_row][] = $part;
    }
}
print_r($grid); 
?>