开发者

Sort a set of arrays based on a single key:value pair in php

开发者 https://www.devze.com 2023-03-13 19:55 出处:网络
Found a question which already explains this - How to sort an array of associative arrays by value of a given key in PHP?

Found a question which already explains this - How to sort an array of associative arrays by value of a given key in PHP?

I have an array (A1) of arrays (A2). I would like to sort all A2s inside A1 based on a key:value pair in A2

The structure is like this

A1
->A2-1
  ->K1:Some Value
  ->K2:ValB开发者_如何学C
->A2-2
  ->K1:Other Value
  ->K2:ValB1
->A2-3
  ->K1:Some Value
  ->K2:ValB2
->A2-4
  ->K1:Other Value
  ->K2:ValB3

I would like to sort the arrays in A1 so that all A2s for which K1's value is Other Value are bunched together and all A2s for which K1's value is Some Value are bunched together

So after the sorting, the final order of arrays in A1 should be A2-2, A2-4, A2-1, A2-3. Is there a function in PHP using which I can do this? Or do I have to parse through the entire array and do the sorting?

Thanks.


http://php.net/manual/en/function.array-multisort.php If that doesn't fit, there's a lot of other array functions http://www.php.net/manual/en/ref.array.php


Have a try with:

$A1 = array(
  'A2-1' => array(
    'K1' => 'Some Value',
    'K2' => 'ValB',
  ),
  'A2-2' => array(
    'K1' => 'Other Value',
    'K2' => 'ValB1',
  ),
  'A2-3' => array(
    'K1' => 'Some Value',
    'K2' => 'ValB2',
  ),
  'A2-4' => array(
    'K1' => 'Other Value',
    'K2' => 'ValB3',
  )
);

function mySort($a, $b) {
    if ($a['K1'] == $b['K1']) {
        return strcmp($a['K2'], $b['K2']);
    } else {
        return strcmp($a['K1'], $b['K1']);
    }
}
uasort($A1, 'mySort');
print_r($A1);

output:

Array
(
    [A2-2] => Array
        (
            [K1] => Other Value
            [K2] => ValB1
        )

    [A2-4] => Array
        (
            [K1] => Other Value
            [K2] => ValB3
        )

    [A2-1] => Array
        (
            [K1] => Some Value
            [K2] => ValB
        )

    [A2-3] => Array
        (
            [K1] => Some Value
            [K2] => ValB2
        )

)


You need something like:

usort($array, function($a, $b)
{
  return strcmp($a['k1'], $b['k1']);
});

You may need to replace strcmp with a different sorting function (or operators) because it's unclear exactly what you are doing.


strategy: 

1.  find unique values, put them aside. 
2.  loop through unique values 
2.1     loop origial array 
2.2        store sub array in $out if unique val = original val


    <?php
    $i=0;

    $a3d = array(
        $i++ => array(0=>'Some Value',1=>'ValB'),
        $i++ => array(0=>'Other Value',1=>'ValB1'),
        $i++ => array(0=>'Some Value',1=>'ValB2'),
        $i++ => array(0=>'Zome moar',1=>'ValB4'),
        $i++ => array(0=>'Other Value',1=>'ValB3'),
        $i++ => array(0=>'Zome Moar',1=>'ValB4'),
    );
    print_r($a3d);

    foreach ($a3d as $a2d){
        $uniq[]= $a2d[0];
    }
    $uniq = array_unique($uniq);

    sort($uniq);
    print_r($uniq);

    foreach ($uniq as $v){
        foreach ($a3d as $kk => $a2d){
            if ($a2d[0] == $v){
                $out[]= $a2d;
                unset($a3d[$kk]); // <--avoid rechecking elements
            }
        }

    }

    print_r(count($a3d));
    print_r($out);
    ?>

$ php sort_array.php 

    Array
    (
        [0] => Array
            (
                [0] => Some Value
                [1] => ValB
            )

        [1] => Array
            (
                [0] => Other Value
                [1] => ValB1
            )

        [2] => Array
            (
                [0] => Some Value
                [1] => ValB2
            )

        [3] => Array
            (
                [0] => Zome moar
                [1] => ValB4
            )

        [4] => Array
            (
                [0] => Other Value
                [1] => ValB3
            )

        [5] => Array
            (
                [0] => Zome Moar
                [1] => ValB4
            )

    )
    Array
    (
        [0] => Other Value
        [1] => Some Value
        [2] => Zome Moar
        [3] => Zome moar
    )
    0Array
    (
        [0] => Array
            (
                [0] => Other Value
                [1] => ValB1
            )

        [1] => Array
            (
                [0] => Other Value
                [1] => ValB3
            )

        [2] => Array
            (
                [0] => Some Value
                [1] => ValB
            )

        [3] => Array
            (
                [0] => Some Value
                [1] => ValB2
            )

        [4] => Array
            (
                [0] => Zome Moar
                [1] => ValB4
            )

        [5] => Array
            (
                [0] => Zome moar
                [1] => ValB4
            )

    )
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号