PHP元素数组,按循环排序;动画;?

PHP元素数组,按循环排序;动画;?,php,arrays,algorithm,animation,Php,Arrays,Algorithm,Animation,我已经问了一个类似的问题,但我需要一个不同的效果。原来的问题是 我有一个简单的数组。数组长度始终是一个平方数。所以16、25、36等等 $array = array('1', '2', '3', '4' ... '25'); 我要做的是,用HTML来排列数组,使它看起来像是一个两边均匀的块 我要做的是对元素进行排序,这样当我将JSON编码的数组传递给jQuery时,它将迭代数组,在当前块中淡入淡出,这样我将得到一个循环动画。所以我想对数组进行这样的排序 所以我的排序数组看起来像 $sor

我已经问了一个类似的问题,但我需要一个不同的效果。原来的问题是


我有一个简单的数组。数组长度始终是一个平方数。所以16、25、36等等

$array = array('1', '2', '3', '4' ... '25');
我要做的是,用HTML来排列数组,使它看起来像是一个两边均匀的块

我要做的是对元素进行排序,这样当我将JSON编码的数组传递给jQuery时,它将迭代数组,在当前块中淡入淡出,这样我将得到一个循环动画。所以我想对数组进行这样的排序

所以我的排序数组看起来像

$sorted = array('1', '6', '11'', '16', '21', '22', '23' .. '13');
有办法吗?。。谢谢


编辑:

我试图通过创建类似矩阵的列/行数组来实现这一点:

$side = 5;

$elems = $side*$side;
$array = range(1,$elems);

for($i=1; $i <= $side; $i++) {
   for($x=$i; $x <= $elems; $x=$x+$side) {
      $columns[$i][] = $x; 
   }
}

for($i=1, $y=1; $i <= $elems; $i=$i+$side, $y++) {
   for($x=$i; $x < $side+$i; $x++) {
      $rows[$y][] = $x;
   }
}
$side=5;
$elems=$side*$side;
$array=范围(1,$elems);

对于($i=1;$i),只要网格始终为正方形,此选项就可以工作:

<?php

    // The size of the grid - 5x5 in the example above
    $gridSize = 5;

    // Create a 2D array representing the grid
    $elements = array_chunk(range(1, pow($gridSize, 2)), $gridSize);

    // Find the half way point - this will be the end of the loop since we
    // want to stop in the middle
    $end = ceil($gridSize / 2);

    // An array to hold the result    
    $result = array();

    // The stopping point of the current interation
    $stop = $gridSize;

    // Loop from start to the middle
    for ($i = 0; $i < $end; $i++) {

        // start in the top left corner
        $x = $y = $i;

        // Traverse Y top to bottom
        while ($y < $stop) {
            $result[] = $elements[$y++][$x];
        }
        $y--;
        $x++;

        // Traverse X left to right
        while ($x < $stop) {
            $result[] = $elements[$y][$x++];
        }
        $x--;
        $y--;

        // Traverse Y bottom to top
        while ($y >= $gridSize - $stop) {
            $result[] = $elements[$y--][$x];
        }
        $y++;
        $x--;

        // Make sure we come in a level
        $stop--;

        // Traverse X right to left
        while ($x >= $gridSize - $stop) {
            $result[] = $elements[$y][$x--];
        }
    }

    print_r($result);

这应该可以。您可以将任何数组传递给circularSort函数,它将返回排序后的数组

e、 g

O(n)中的另一种方法:


我的解决方案:

诀窍是:第一次运行是5,然后两次运行4个元素,两次运行3个元素,两次运行2个元素,两次运行1个元素。(5,4,4,3,3,2,2,1,1)在每次运行中,它都会增加一个状态模块4。根据状态,运行会朝一个方向或另一个方向进行

代码如下:

function circularSort(array $array) {
    $n2=count($array);
    $n=sqrt($n2);
    if((int)$n != $n) throw new InvalidArgumentException();

    $Result = Array();
    $run =$n; $dir=1;
    $x=0; $y=-1;
    $i=0;
    $st=0;
    while ($run) {
        while ($dir) {
            for ($j=0; $j<$run; $j++) {

                if ($st==0) $y++;
                if ($st==1) $x++;
                if ($st==2) $y--;
                if ($st==3) $x--;

                $p=$y * $n +$x;
                array_push($Result,$array[$p]);

            }
            $st = ($st +1) & 3;
            $dir--;
        }

        $dir=2;
        $run--;
    } 

    return $Result;
}

$a = range(1,25);
var_dump(circularSort($a));
函数循环排序(数组$array){
$n2=计数($array);
$n=平方米($n2);
如果((int)$n!=$n)抛出新的InvalidArgumentException();
$Result=Array();
$run=$n;$dir=1;
$x=0;$y=-1;
$i=0;
$st=0;
while($run){
while($dir){

对于($j=0;$j从技术上讲,这与PHP完全没有关系。这是一件纯粹用javascript来做的事情,不管PHP发送了什么。无论您的原始问题中提供了什么解决方案,都同样适用于这里,只需更改迭代数组的方式。我不确定实际问题是什么。您是否要求人们编写你知道这个相当复杂的动画的jQuery代码吗?@millimoose-一群人很快就回答了一个类似的问题。所以我想对一些人来说,这东西更容易,而且他们在做这种排序/算法功能时没有问题。我正在尝试,但一直失败。我的代码很长,很慢,而且有问题。这可以用si解决与前一种方法类似。基本思想是将原始的“线性”数组拼接成实际的二维“正方形”数组。然后使用数组索引遍历它,以建立数组的顺序elements@Matt问题是你的问题到处都是,而且不清楚你在问什么。如果你只想要排序算法,甚至不要提及jQuery和动画等等,只需给出所需问题的输入和输出示例。然后观察您的问题结束,因为您没有显示任何您尝试过的代码或描述您在这方面遇到的问题。(您最初的问题在这方面质量也很低,得到回答是一种侥幸。)非常感谢!非常好用
$array = range(1, 25);
$circularArray = circularSort($array);
<?php
function circ_sort ($inArray) {

    $rowSize = pow(count($inArray), 0.5);
    if((int)$rowSize != $rowSize) {
        throw new InvalidArgumentException();
    }
    $rowSize = (int)$rowSize;

    $round =-1;
    for ($x =-1, $y=0, $count =0; $count < count($inArray);) {

        if ($y > $x) {
            if ($x +1 == $y) {
                $direction = 'D';   //Down
                $round ++;
                $max_iter = $rowSize - (2 * $round);
            } else {
                $direction = 'L'; //Left
                $max_iter = $y - $x -1;
            }
        } else if ($x > $y) {
            $direction = 'R'; //Right
            $max_iter = $rowSize - (2 * $round) -1;

        } else if ($x == $y) {
            $direction = 'U'; //Up
            $max_iter = $rowSize - (2 * $round) -1;

        }

        switch ($direction) {
            case 'D':   //Down
                for ($iter =0; $iter < $max_iter; $iter++) {
                    $x++;
                    $circArray[] = $inArray[$x*$rowSize + $y];
                    $count++;
                }
                break;
            case 'R': //Right
                for ($iter =0; $iter < $max_iter; $iter++) {
                    $y++;
                    $circArray[] = $inArray[$x*$rowSize + $y];
                    $count++;
                }
                break;
            case 'U':   //Up
                for ($iter =0; $iter < $max_iter; $iter++) {
                    $x--;
                    $circArray[] = $inArray[$x*$rowSize + $y];
                    $count++;
                }
                break;
            case 'L':   //Left
                for ($iter =0; $iter < $max_iter; $iter++) {
                    $y--;
                    $circArray[] = $inArray[$x*$rowSize + $y];
                    $count++;
                }
                break;
        }
    }
    return ($circArray);
}

$array = range(1, 25);
$circ_array = circ_sort($array);

var_dump($circ_array);

?>
function circularSort(array $array) {
    $n2=count($array);
    $n=sqrt($n2);
    if((int)$n != $n) throw new InvalidArgumentException();

    $Result = Array();
    $run =$n; $dir=1;
    $x=0; $y=-1;
    $i=0;
    $st=0;
    while ($run) {
        while ($dir) {
            for ($j=0; $j<$run; $j++) {

                if ($st==0) $y++;
                if ($st==1) $x++;
                if ($st==2) $y--;
                if ($st==3) $x--;

                $p=$y * $n +$x;
                array_push($Result,$array[$p]);

            }
            $st = ($st +1) & 3;
            $dir--;
        }

        $dir=2;
        $run--;
    } 

    return $Result;
}

$a = range(1,25);
var_dump(circularSort($a));