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));