php模数如何理解,php – 使用模数排序

设置以下内容:

$array = range('A', 'M');

$columns = 4;

$length = count($array);

print_matrix($array, $columns);

它通过索引(行和列)输出每个成员及其键,以及顶部的元素顺序:

One row - A B C D E F G H I J K L M

A[ 0] B[ 1] C[ 2] D[ 3]

E[ 4] F[ 5] G[ 6] H[ 7]

I[ 8] J[ 9] K[10] L[11]

M[12]

链接的javascript代码可以很容易地转换为PHP.但是,如果仔细查看该问题/答案,很明显它只适用于完整行,就像我以前的尝试一样:

function callback_sort($array, $columns)

{

$sort = function($columns)

{

return function($a, $b) use ($columns)

{

$bycol = ($a % $columns) - ($b % $columns);

return $bycol ? : $a - $b;

};

};

uksort($array, $sort(4));

return $array;

}

输出:

One row - A E I M B F J C G K D H L

A[ 0] E[ 4] I[ 8] M[12]

B[ 1] F[ 5] J[ 9] C[ 2]

G[ 6] K[10] D[ 3] H[ 7]

L[11]

所以只是在另一个问题中提供的功能不起作用.

但由于数组已经排序,您不需要再次对其进行排序,只需更改顺序或元素即可.但是哪个订单呢?如果矩阵不完整,例如n x n完全填充,每列需要计算不同的新索引.采用13个元素(A-M)的示例为每列提供以下行分布:

column: 1 2 3 4

rows: 4 3 3 3

因此,每列,值都不同.例如,在索引12处,第13个元素位于第4行.在前往该位置的路上,它已经通过第1列4次,在其他列2-4中通过3次.因此,要获得迭代索引的虚拟索引,您需要总结每列中的频率,以找出原始索引中有多少数字.如果超过最大成员数,则继续为0.

因此,可以通过逐步转发每个索引来迭代解决,以便在索引上分配计算:

Index 0:

No column: 0

Index 1:

1x in column is which has 4 rows: 4

Index 2:

1x in column 1 (4 rows) and 1x in other columns (3 rows): 4 + 3

… 等等.如果虚拟索引超过12,它将从0开始,例如对于虚拟索引将计算的第5个元素(索引4)13:

Index 4:

1x 4 rows and 3x 3 rows = 13 (4 + 9)

13 > 12 => 1 (13 - 12)

现在通过从虚拟索引0开始并每次给出适当的偏移量来填充一个新数组(查看您所在的列,添加该列的行数,必要时换行)将提供所需的输出:

One row - A E H K B F I L C G J M D

A[ 0] E[ 4] H[ 7] K[10]

B[ 1] F[ 5] I[ 8] L[11]

C[ 2] G[ 6] J[ 9] M[12]

D[ 3]

用代码编写,这是对原始索引的简单描述.通过维护键的索引,这适用于任何数组,甚至包含字符串键的数组:

$floor = floor($length/$columns);

$modulo = $length % $columns;

$max = $length-1;

$virtual = 0;

$keys = array_keys($array);

$build = array();

foreach($keys as $index => $key)

{

$vkey = $keys[$virtual];

$build[$vkey] = $array[$vkey];

$virtual += $floor + ($index % $columns < $modulo);

($virtual>$max) && $virtual %= $max;

}

print_matrix($build, $columns);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值