【问题标题】:How to sort an array in PHP in a specific way如何以特定方式在 PHP 中对数组进行排序
【发布时间】:2015-03-27 10:10:23
【问题描述】:

代码:

$array = array('even' => array(array('key' => 'test','key2' => 'Wn'), array('key' => 'test3', 'key2' => 'Bx')),
                'not_even' => array(array('key' => 'test2','key2' => 'Xn'), array('key' => 'test4', 'key2' => 'Gy')),
);

echo '<pre>';
print_r($array);
echo '</pre>';

输出:

Array
(
    [even] => Array
        (
            [0] => Array
                (
                    [key] => test
                    [key2] => Wn
                )

            [1] => Array
                (
                    [key] => test3
                    [key2] => Bx
                )

        )

    [not_even] => Array
        (
            [0] => Array
                (
                    [key] => test2
                    [key2] => Xn
                )

            [1] => Array
                (
                    [key] => test4
                    [key2] => Gy
                )

        )

)

我想对其进行排序,结果应该是:

Array
(
    [0] => Array
        (
            [key] => test
            [key2] => Wn
        )

    [1] => Array
        (
            [key] => test2
            [key2] => Xn
        )

    [2] => Array
        (
            [key] => test3
            [key2] => Bx
        )

    [3] => Array
        (
            [key] => test4
            [key2] => Gy
        )

)

那么如何排序呢?数组中的键应该是: 测试 测试2 测试3 测试4。 如何为此使用 foreach 或其他东西?什么是最好的解决方案。 重要的是“key”,“key2”无所谓。

【问题讨论】:

  • 你不想对数组进行排序,你想重新组织它的数据(也许对它进行排序,从问题中不清楚)。 foreach() 是一个简单的解决方案。 PHP 函数 array_map()array_reduce() 也可以提供帮助。你试过什么?

标签: php arrays sorting multidimensional-array foreach


【解决方案1】:

试试这个

$array = array('even' => array(array('key' => 'test5','key2' => 'Wn'),    array('key' => 'test10', 'key2' => 'Bx')),
'not_even' => array(array('key' => 'test1','key2' => 'Xn'), array('key' => 'test', 'key2' => 'Gy')),
);

$new_array = array();

// changing  structure
foreach($array as $values){
$new_array = array_merge($new_array, $values);
}

// dump array
echo '<pre>';
print_r($new_array );
echo '</pre>';

// sorting
/// function for sorting
function cmp($a, $b)
{
   return strcasecmp($a['key'], $b['key']);
}

// sort by 'key' 
uksort($new_array, "cmp");

// dump array
echo '<pre>';
print_r($new_array );
echo '</pre>';

注意:这是字符串排序,所以 test10

【讨论】:

  • 不清楚你想按什么排序。从您的代码中,我看到数组的结构已更改。但未排序。
  • 你的答案很好,但不是我想要的。结果应该是: $new_array[0][key] => test, $new_array[1][key] => test2 等等,而不是 $new_array[0][key] => test, $new_array[1] [key] => test3.. so modo 或类似的键?
  • 更新了代码,现在正在排序。您还可以更改“cmp”函数的逻辑。
【解决方案2】:

试试这个例子,我已经在我的系统中进行了测试,它运行良好。

<?php
$array = array('even' => array(array('key' => 'test','key2' => 'Wn'), array('key' => 'test3', 'key2' => 'Bx')),
                 'not_even' => array(array('key' => 'test2','key2' => 'Xn'), array('key' => 'test4', 'key2' => 'Gy')),
);
//Before Sorting
echo '<pre>';
print_r($array);
echo '</pre>';

$my_array = array();
foreach($array as $values){
$my_array = array_merge($my_array, $values);
}

//After Sorting
asort($my_array);
echo '<pre>';
print_r($my_array );
echo '</pre>'; 
?> 

输出:-

Array
(
    [even] => Array
        (
            [0] => Array
                (
                    [key] => test
                    [key2] => Wn
                )

            [1] => Array
                (
                    [key] => test3
                    [key2] => Bx
                )

        )

    [not_even] => Array
        (
            [0] => Array
                (
                    [key] => test2
                    [key2] => Xn
                )

            [1] => Array
                (
                    [key] => test4
                    [key2] => Gy
                )

        )

)

Array
(
    [0] => Array
        (
            [key] => test
            [key2] => Wn
        )

    [2] => Array
        (
            [key] => test2
            [key2] => Xn
        )

    [1] => Array
        (
            [key] => test3
            [key2] => Bx
        )

    [3] => Array
        (
            [key] => test4
            [key2] => Gy
        )

)

我认为这是你需要的。

【讨论】:

    【解决方案3】:

    您可以使用array_multisort()

    试试这样的:

    foreach ($array as $key => $row) {
       $array1[$key]  = $row[0]; 
    }
    
    array_multisort($array1, SORT_DESC, $array);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 1970-01-01
      • 1970-01-01
      • 2019-10-19
      • 1970-01-01
      • 2010-09-26
      相关资源
      最近更新 更多