php中的小型排序算法
它应该是非常简单的算法,但我就是无法绕过它。
我有一些按字母顺序排列的数组
[0] => Array
(
[0] => a
[1] => b
[2] => c
)
,例如
[0] => Array
(
[0] => a
[1] => b
[2] => c
[3] => d
)
,我需要将它们排序为行。例如:
我应该收到一个包含 3 列和尽可能多的行的表,并且应该按字母顺序排列。
这是一个例子: 第一个数组应该转换为
[0] => Array
(
[0] => Array
(
[0] => a
[1] => b
[2] => c
)
)
但第二个数组应该是
[1] => Array
(
[0] => Array
(
[0] => a
[1] => c
[2] => d
)
[1] => Array
(
[0] => b
)
)
我在 php 中编写的,所以如果有人可以帮助我,我将非常感激。
UPD: 代码示例:
function sortAsOrdered( array $categories )
{
foreach ( $categories as $groupId => $group )
{
$regroupMenuItems = array();
$limit = count( $group );
$rows = ceil( $limit / 3 );
for ( $i = 0; $i < $rows; ++$i )
{
$jumper = 0;
for ( $j = 0; $j < 3; $j++ )
{
if ( 0 == $jumper )
{
$jumper = $i;
}
if ( isset( $group[ $jumper ] ) )
{
$regroupMenuItems[ $i ][ $j ] = $group[ $jumper ];
}
$jumper = $jumper + $rows;
}
}
$categories[ $groupId ] = $regroupMenuItems;
}
return $categories;
}
伙计们,我解决了这个问题。在这里你可以看到我的算法http://pastebin.com/xe2yjhYW。 但不要悲伤,你的帮助不会白费。我可能只会为那些帮助我完成这个困难算法的人提供赏金。
伙计们再次感谢。你的想法激励我以不同的方式思考。
It should quite simple algorithm, but I just can't get around it.
I have some arrays in alphabetical order
[0] => Array
(
[0] => a
[1] => b
[2] => c
)
and for example
[0] => Array
(
[0] => a
[1] => b
[2] => c
[3] => d
)
and I need to sort them into rows. For example:
I should receive a table with 3 columns and as many rows as it may get and it should be in alphabetical order.
Here is an example:
First array should be converted into
[0] => Array
(
[0] => Array
(
[0] => a
[1] => b
[2] => c
)
)
But second one should be as
[1] => Array
(
[0] => Array
(
[0] => a
[1] => c
[2] => d
)
[1] => Array
(
[0] => b
)
)
I'm writing it in php
, so if anyone can help I would be really appreciated.
UPD:
Code example:
function sortAsOrdered( array $categories )
{
foreach ( $categories as $groupId => $group )
{
$regroupMenuItems = array();
$limit = count( $group );
$rows = ceil( $limit / 3 );
for ( $i = 0; $i < $rows; ++$i )
{
$jumper = 0;
for ( $j = 0; $j < 3; $j++ )
{
if ( 0 == $jumper )
{
$jumper = $i;
}
if ( isset( $group[ $jumper ] ) )
{
$regroupMenuItems[ $i ][ $j ] = $group[ $jumper ];
}
$jumper = $jumper + $rows;
}
}
$categories[ $groupId ] = $regroupMenuItems;
}
return $categories;
}
Guys I solved this one. Here you could see my algorithm http://pastebin.com/xe2yjhYW.
But don't be sad your help will not go in vain. I probably will place bounty just for those who helped with this dificult algorithm for me.
Guys thanks one more time. Your thoughts inspired me to think differently.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
array_chunk 是解决该问题的自然第一种方法,但它并不能完全满足您的需要。如果以这种方式提供解决方案,则需要在处理之前重新构造结果数组或重新构造输入,如下所示:
查看实际情况。
array_chunk
is a natural first approach to the problem, but it won't do exactly what you need to. If the solution is provided that way, you need to either restructure the resulting array or restructure the input before processing it, as below:See it in action.
让我们看看这是否更接近标记
哪个 - 当这样运行时:
给出:
这还没有对每一行进行排序,但这就是您想要的东西吗?
开始facepalm编辑
...或者当然,
array_chunk($aList, 3)
在你排序后O_ohttps://www.php.net/manual/en/function.array-chunk.php
我会留下以下所有内容以供参考或其他 -我完全忘记了 array_chunk()
endfacepalm edit
我会在循环中使用模数,在其中计算数组索引(对数组进行排序后) - 例如,如果您尝试要将数组分成 3 个“列”,您可以尝试以下操作:
编辑代码示例:
只需在我的本地服务器上运行它(并更正拼写错误),它的输出为:
可能有一种更简洁的方法(即有点程序化)但它应该可以完成工作。
Let's see if this is nearer the mark
Which - when run thus:
Gives:
That's not sorting each row yet but is that the kind of thing you're after?
begin facepalm edit
... or of course,
array_chunk($aList, 3)
after you've sorted it O_ohttps://www.php.net/manual/en/function.array-chunk.php
I'll leave everything below for reference or whatever - I'd completely forgotten about array_chunk()
end facepalm edit
I'd use a modulo in a loop where you're counting the array index (after sorting the array) - for instance if you're trying to split an array into 3 "columns" you could try something like:
EDIT code example:
Just ran it on my local server (and corrected the typo), and it outputs as:
There's probably a tidier way of doing it (that's a little procedural) but it should do the job.
怎么样:
输出:
How about:
output:
为此,您需要执行两个操作:
首先,将数组尽可能均匀地分成 3 组。
然后,“转置”数组,以便行和列交换位置。
array_transpose(array_grouped($arr, 3))
按您想要的顺序提供条目。In order to do this, you need to do two operations:
First, split the array into 3 groups, as evenly as possible.
Then, "transpose" the array, so that rows and columns switch places.
array_transposed(array_grouped($arr, 3))
gives you entries in the order you want them.耶耶耶!我明白了。如果您经常这样做,您可以将其变成一个函数。
其输出是:
YAYAYAY!! I've got it. You could turn this into a function if you'll be doing it regularly.
The output from this is:
如果简单地说,那么这里是该算法的一个方法。
我还为此添加了 PHPUnit 测试。您可以在链接中找到它。
If to say it shortly, then here is a method for that algorithm.
Also I included PHPUnit test for that. You can find it at, that link.
array_chunk() 一直是解决方案,但如您所愿专门排序,这对你没有多大帮助。
所以这是我的五美分:
这会给你:
这个函数的缺点是你只能告诉一个块中元素的最大数量,然后它将数组平均划分为块。因此,对于 [4] 和 max_size 3,您将得到 [2,2],与预期的 [3,1] 不同。
array_chunk() wold have been the solution but as you want it to be specially sorted, that wouldn't help you much.
So here is my five cents:
Which will give you:
The downside of this function is that you can only tell the max number of elements in a chunk, and then it equally divides the array to chunks. So for [4] and max_size 3 you will get [2,2] unlike the expected [3,1].