PHP在array_multisort排序不是我的多维数组如预期 [英] PHP array_multisort not sorting my multidimensional array as expected

查看:112
本文介绍了PHP在array_multisort排序不是我的多维数组如预期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图梳理用在array_multisort功能的多维数组

我期待多维数组在$排序使用值秩序本身。
$排序涉及到我的多维数组的体积元。

我想name元素是按以下顺序:

<名> => 8,'名'=> 6,'名'=> 7,'名'=> 9','名'=> 10,'名'=> 10

未如预期返回的顺序。也许我误解了如何在array_multisort工作?

 阵列

[TEST1] =&GT;排列
    (
        [体积] =&GT; 67
         =&GT; 2
        [名] =&GT; 6
        [NUM] =&GT; 2
    )[TEST2] =&GT;排列
    (
        [体积] =&GT; 86
         =&GT; 1
        [名] =&GT; 7
        [类型] = GT; 2
    )[TEST3] =&GT;排列
    (
        [体积] =&GT; 85
         =&GT; 6
        [名] =&GT; 8
        [类型] = GT; 2
    )[TEST4] =&GT;排列
    (
        [体积] =&GT; 98
         =&GT; 2
        [名] =&GT; 9
        [类型] = GT; 2
    )[TEST5] =&GT;排列
    (
        [体积] =&GT; 86
         =&GT; 6
        [名] =&GT; 10
        [类型] = GT; 2
    )[TEST6] =&GT;排列
    (
        [体积] =&GT; 67
         =&GT; 7
        [名] =&GT; 11
        [类型] = GT; 2
    ))$排序=阵列(85,67,86,98,86,67);
在array_multisort($排序,$数据);

下面是原来的数组:

  $数据['TEST1'] =阵列('量'=&GT; 67'版'=&GT; 2,'名'=&GT; 6,NUM =大于2,);
$数据['测试2'] =阵列('量'=&GT; 86'版'=大于1,'名'=大于7,类型=大于2,);
$数据['TEST3'] =阵列('量'=&GT; 85'版'=&GT; 6,'名'=→8,类型=大于2,);
$数据['TEST4'] =阵列('量'= 98'版'=大于2,'名'=&GT; 9,类型=大于2,);
$数据['TEST5'] =阵列('量'=&GT; 86'版'=&GT; 6,'名'=&GT; 10,类型=大于2,);
$数据['TEST6'] =阵列('量'=&GT; 67'版'=大于7,'名'=&GT; 11,类型=大于2,);


解决方案

通过阵列Multisort,你可以根据一列排序。这是一个例子,在那里你可以很容易地排序所有可用列:

 &LT ;?
$数据['TEST1'] =阵列('量'=&GT; 67'版'=大于2,'名'=&GT; 6,类型= GT; 2);
$数据['测试2'] =阵列('量'=&GT; 86'版'=大于1,'名'=大于7,类型= GT; 2);
$数据['TEST3'] =阵列('量'=&GT; 85'版'=&GT; 6,'名'=→8,类型= GT; 2);
$数据['TEST4'] =阵列('量'= 98'版'=大于2,'名'=&GT; 9,类型= GT; 2);
$数据['TEST5'] =阵列('量'=&GT; 86'版'=&GT; 6,'名'=&GT; 10,类型= GT; 2);
$数据['TEST6'] =阵列('量'=&GT; 67'版'=大于7,'名'=&GT; 11,类型= GT; 2);//创建索引行
的foreach(如$行$数据){
  的foreach($行为$关键=&GT; $值){
    $ {$}键[] = $价值; //创建$音量,$版,$ name和$类型数组。
  }
}//例如:排序版ASC,然后按名称DESC:在array_multisort($版,SORT_ASC,$名称,SORT_DESC,$数据);回声&LT; pre&gt;中;
的print_r($数据);
回声&LT; / pre&gt;中;
?&GT;

将导致(首先由ASC版,然后按名称DESC):
(按名称排序ASC,将交换TEST4和test1的OFC)。

 阵列

    [TEST2] =&GT;排列
        (
            [体积] =&GT; 86
             =&GT; 1
            [名] =&GT; 7
            [类型] = GT; 2
        )    [TEST4] =&GT;排列
        (
            [体积] =&GT; 98
             =&GT; 2
            [名] =&GT; 9
            [类型] = GT; 2
        )    [TEST1] =&GT;排列
        (
            [体积] =&GT; 67
             =&GT; 2
            [名] =&GT; 6
            [类型] = GT; 2
        )    [TEST5] =&GT;排列
        (
            [体积] =&GT; 86
             =&GT; 6
            [名] =&GT; 10
            [类型] = GT; 2
        )    [TEST3] =&GT;排列
        (
            [体积] =&GT; 85
             =&GT; 6
            [名] =&GT; 8
            [类型] = GT; 2
        )    [TEST6] =&GT;排列
        (
            [体积] =&GT; 67
             =&GT; 7
            [名] =&GT; 11
            [类型] = GT; 2
        ))

如果你喜欢,你可以添加任意多列。我希望这有助于。

编辑:至于你的问题:
不,阵列MultiSort不进行排序基于predefined顺序阵列。什么在array_multisort所做的是:
它按给定的条件(ASC或DESC)的数组,并在另一个阵列移动条目相对向上或向下,不侵犯其他数组排序

基本的例子:

  $字母=阵列(B,A,C);
$数=阵列(5,4,2);

调用在array_multisort($字母,$数字)将导致 A,B,C 和(a具有上升,b向下) 4,5,2

如果该例子将是:

  $字母=阵列(B,一,一个);
$数=阵列(5,4,2);

第一相同的排序将适用于:( A,A,B - > 4,2,5 ) ,但随后在array_multisort通知,它可以交换两个 A s到排序2和4。最后的结果: A,A,b - > 2,4,5

回到你的问题:

要由predefined进行排序,你可以做到以下几点:

1)定义您的订单,即 $为了=阵列(A,Z,B);

2)呼叫 uasort 与用户的功能。

3)里那种功能,使用数组翻转和assoc命令访问,以获得实际位置:

  $项=阵列(一,B,Z,一个,Z,Z);uasort($项目,sortBy predefinedOrder);功能sortBy predefinedOrder($ leftItem,$ rightItem){
  $顺序=阵列(一,Z,B,X); //定义某处  $翻转= array_flip($顺序); //所以我们可以的价值立场访问  $ leftPos = $翻转[$ leftItem];
  $ rightPos = $翻转[$ rightItem];
  返回$ leftPos&GT; = $ rightPos;
}的print_r($项目); //阵列([0] =&gt;一种[3] =&gt;一种[2] =&将Z [4] =&将Z [5] =&将Z [1] =&GT; B)

您的多维输入,你可以用

  $ leftPos = $翻转[$ leftItem [卷]];
  $ rightPos = $翻转[$ rightItem [卷]];

但OFC。这将要求您predict的predefined为了阵列中的所有值,并用适当的返回值处理IndexOutOfBoundExceptions。

I am trying to sort a multidimensional array using the array_multisort function

I was expecting the multidimensional array to order itself using the values in $sort. $sort relates to the volume element of my multidimensional array.

I would like the name element to be in this order:

'name' => 8, 'name' => 6, 'name' => 7, 'name' => 9', 'name' => 10, 'name' => 10,

The returned order is not as expected. Perhaps I have misunderstood how array_multisort works?

Array
(
[test1] => Array
    (
        [volume] => 67
        [edition] => 2
        [name] => 6
        [num] => 2
    )

[test2] => Array
    (
        [volume] => 86
        [edition] => 1
        [name] => 7
        [type] => 2
    )

[test3] => Array
    (
        [volume] => 85
        [edition] => 6
        [name] => 8
        [type] => 2
    )

[test4] => Array
    (
        [volume] => 98
        [edition] => 2
        [name] => 9
        [type] => 2
    )

[test5] => Array
    (
        [volume] => 86
        [edition] => 6
        [name] => 10
        [type] => 2
    )

[test6] => Array
    (
        [volume] => 67
        [edition] => 7
        [name] => 11
        [type] => 2
    )

)

$sort = array(85, 67, 86, 98, 86, 67);
array_multisort($sort, $data);

Here is the original array:

$data['test1'] = array('volume' => 67, 'edition' => 2, 'name' => 6, 'num' => 2,);
$data['test2'] = array('volume' => 86, 'edition' => 1, 'name' => 7, 'type' => 2,);
$data['test3'] = array('volume' => 85, 'edition' => 6, 'name' => 8, 'type' => 2,);
$data['test4'] = array('volume' => 98, 'edition' => 2, 'name' => 9, 'type' => 2,);
$data['test5'] = array('volume' => 86, 'edition' => 6, 'name' => 10, 'type' => 2,);
$data['test6'] = array('volume' => 67, 'edition' => 7, 'name' => 11, 'type' => 2,);

解决方案

With array Multisort, you can Sort depending on a column. This is a example, where you can easily sort by "all" available columns:

<?
$data['test1'] = array('volume' => 67, 'edition' => 2, 'name' => 6, 'type' => 2);
$data['test2'] = array('volume' => 86, 'edition' => 1, 'name' => 7, 'type' => 2);
$data['test3'] = array('volume' => 85, 'edition' => 6, 'name' => 8, 'type' => 2);
$data['test4'] = array('volume' => 98, 'edition' => 2, 'name' => 9, 'type' => 2);
$data['test5'] = array('volume' => 86, 'edition' => 6, 'name' => 10, 'type' => 2);
$data['test6'] = array('volume' => 67, 'edition' => 7, 'name' => 11, 'type' => 2);

//Create index rows
foreach ($data as $row) {
  foreach ($row as $key => $value){
    ${$key}[]  = $value; //Creates $volume, $edition, $name and $type arrays.
  }  
}

//ex: sort by edition asc, then by name DESC:

array_multisort($edition, SORT_ASC, $name, SORT_DESC, $data);

echo "<pre>";
print_r($data);
echo "</pre>";
?>

will result in (first by edition ASC, then by name DESC): (sorting by name ASC, will swap test4 and test1 ofc.)

Array
(
    [test2] => Array
        (
            [volume] => 86
            [edition] => 1
            [name] => 7
            [type] => 2
        )

    [test4] => Array
        (
            [volume] => 98
            [edition] => 2
            [name] => 9
            [type] => 2
        )

    [test1] => Array
        (
            [volume] => 67
            [edition] => 2
            [name] => 6
            [type] => 2
        )

    [test5] => Array
        (
            [volume] => 86
            [edition] => 6
            [name] => 10
            [type] => 2
        )

    [test3] => Array
        (
            [volume] => 85
            [edition] => 6
            [name] => 8
            [type] => 2
        )

    [test6] => Array
        (
            [volume] => 67
            [edition] => 7
            [name] => 11
            [type] => 2
        )

)

You can add as many columns if you like. I hope this helps.

Edit: As to your question: No, Array MultiSort is NOT for sorting arrays based on a predefined order. What array_multisort does is: It Sorts an array by the given Condition (asc or desc) and moves entries in the other arrays relatively up or down, without violating the sorting of any other array.

basic example:

$letters = array("b","a","c");
$numbers = array(5,4,2);

calling array_multisort($letters,$numbers) will result in a,b,c and (a has moved up, b down) 4,5,2

if the example would be:

$letters = array("b","a","a");
$numbers = array(5,4,2);

first the same sorting will apply: (a,a,b -> 4,2,5), but then array_multisort notices, that it can swap the both as to sort 2 and 4. Final REsult: a,a,b -> 2,4,5

Back to your question:

To sort by a predefined order, you can do the following:

1.) Define your order, i.e. $order = array("a","z","b");

2.) Call uasort with a user function.

3.) Inside that sort function, use array flip and assoc access to get the actual position:

$items = array("a","b","z","a","z","z");

uasort($items, "sortByPredefinedOrder");

function sortByPredefinedOrder($leftItem, $rightItem){
  $order = array("a","z","b","x"); //defined somewhere

  $flipped = array_flip($order); //so we can access "position by value"

  $leftPos = $flipped[$leftItem];
  $rightPos = $flipped[$rightItem];
  return $leftPos >= $rightPos;   
}

print_r($items); //Array ( [0] => a [3] => a [2] => z [4] => z [5] => z [1] => b )

for your multidimensional Input, you can use

  $leftPos = $flipped[$leftItem["volume"]];
  $rightPos = $flipped[$rightItem["volume"]];

But ofc. this would require you to predict ALL values inside the predefined order Array and handle IndexOutOfBoundExceptions with appropriate return values.

这篇关于PHP在array_multisort排序不是我的多维数组如预期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆