Сортировка массива php

318
23 июня 2017, 10:02

Есть массив

$arr

у него несколько ключей $arr['c'] и $arr['m'] в них разные значения, мне нужно отсортировать по убыванию массив $arr['c'] то есть если

$arr['c'] = 0, $arr['m'] = 1
$arr['c'] = 0, $arr['m'] = 2
$arr['c'] = 7, $arr['m'] = 3
$arr['c'] = 2, $arr['m'] = 4

то будет

$arr['c'] = 7, $arr['m'] = 3
$arr['c'] = 2, $arr['m'] = 4
$arr['c'] = 0, $arr['m'] = 1
$arr['c'] = 0, $arr['m'] = 2

Код записи в массив

foreach ($result2 as $key2 => $value2) { $arr[] = ['m'=>$value['manufacturer_id'],'c'=>$value2["COUNT(product_id)"]]; }

print_r($arr)

Array ( 
[0] => Array ( [m] => 1 [c] => 7 ) ) 
Array ( 
[0] => Array ( [m] => 2 [c] => 0 ) ) 
Array ( 
[0] => Array ( [m] => 3 [c] => 0 ) ) 
Array ( 
[0] => Array ( [m] => 4 [c] => 0 ) )
Array (
[0] => Array ( [m] => 5 [c] => 13 ) ) 
Array ( 
[0] => Array ( [m] => 6 [c] => 1 ) ) 
Array ( 
[0] => Array ( [m] => 7 [c] => 7 ) )
Answer 1

Лично я использую функцию usort. Ей передаем массив и анонимную функцию сортировки.

$arr = array(
    array('c' => 7, 'm' => 1),
    array('c' => 0, 'm' => 2),
    array('c' => 0, 'm' => 3),
    array('c' => 0, 'm' => 4),
    array('c' => 13, 'm' => 5),
    array('c' => 1, 'm' => 6),
    array('c' => 7, 'm' => 7),
);
usort($arr, function($a, $b) {
    return $a['c'] < $b['c'];
});
Answer 2

На самом деле непонятно, зачем вы используете такую странную структуру данных для случая, когда элементы m и c являются связанными.

Я бы на вашем месте для начала преобразовал массив ['m'=>[values_m...],'c'=>[values_c...]] к виду [['m'=>value_m, 'c'=>value_c]...], а потом, когда необходимо, использовал usort

PHP 7 Для 5 надо чуть поменять функцию сортировки в usort

$in = ['m'=>[values_m...],'c'=>[values_c...]];
$out = [];
for($i=0;$i<count($in['m']);$i++){
    $out[] = ['m'=>$in['m'][$i], 'c'=>$in['c'][$i]];
}
usort($out, function($a, $b){ return $a['c'] <=> $b['c']; });

sandbox

Answer 3

Вот еще один вариант на php

<?php
    $arr = array(
        array('c' => 7, 'm' => 1),
        array('c' => 0, 'm' => 2),
        array('c' => 0, 'm' => 3),
        array('c' => 0, 'm' => 4),
        array('c' => 13, 'm' => 5),
        array('c' => 1, 'm' => 6),
        array('c' => 7, 'm' => 7),
    );
    usort($arr, function($a, $b) {
        return $b['c'] - $a['c'];
    });
    echo '<pre>';
    print_r($arr);
?>
Answer 4

Ваш код в исправленном виде:

    foreach ($result_two as $key_two => $value_two) { 
        $arr['c'][] = $value_two["COUNT(product_id)"];
        $arr['m'][] = $value['manufacturer_id']; 
    }  
    for($i=0; $i<count($arr['c']); $i++){
        for($j=$i+1; $j<count($arr['c']); $j++){
            if($arr['c'][$i]<$arr['c'][$j]){
                $tempC = $arr['c'][$j];
                $tempM = $arr['m'][$j];
                $arr['c'][$j] = $arr['c'][$i];
                $arr['m'][$j] = $arr['m'][$i];
                $arr['c'][$i] = $tempC;
                $arr['m'][$i] = $tempM;
            }
        }
    }
    print_r($arr);

На выходе $arr:

    $arr['c'][] = 7; $arr['m'][] = 3;
    $arr['c'][] = 2; $arr['m'][] = 4;
    $arr['c'][] = 0; $arr['m'][] = 1;
    $arr['c'][] = 0; $arr['m'][] = 2;

Массив ДО, из PHPStorm:

Array
(
    [c] => Array
        (
            [0] => 0
            [1] => 0
            [2] => 7
            [3] => 2
        )
    [m] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
        )
)

Массив ПОСЛЕ, из PHPStorm:

Array
(
    [c] => Array
        (
            [0] => 7
            [1] => 2
            [2] => 0
            [3] => 0
        )
    [m] => Array
        (
            [0] => 3
            [1] => 4
            [2] => 1
            [3] => 2
        )
)
READ ALSO
Подключиться к серверу в сети (PHP)

Подключиться к серверу в сети (PHP)

Добрый деньМожет быть вопрос покажется глупым или невозможным, но все-таки интересно

439
Как правильно сформировать вывода SQL? [дубликат]

Как правильно сформировать вывода SQL? [дубликат]

На данный вопрос уже ответили:

267
localhost в wordpress, какой реальный адрес сервера?

localhost в wordpress, какой реальный адрес сервера?

В wp-configphp указан DB_HOST как localhost

283