Подтвердить что ты не робот

Как отсортировать массив PHP с помощью элемента, вложенного внутри?

У меня есть массив вроде следующего:

Array
(
    [0] => Array
        (
            'name' => "Friday"
            'weight' => 6
        )
    [1] => Array
        (
            'name' => "Monday"
            'weight' => 2
        )
)

Я хотел бы получить последние значения в этом массиве ( "вес" ) и использовать их для сортировки основных элементов массива. Итак, в этом массиве я хотел бы отсортировать его, чтобы элемент "Понедельник" появился перед элементом "Friday".

4b9b3361

Ответ 1

Вы можете использовать usort как:

function cmp($a, $b) {
   return $a['weight'] - $b['weight'];
}

usort($arr,"cmp");

Ответ 3

Может быть выполнено с помощью анонимной функции .

Также, если ваш вес является строкой , используйте один из других возвратов (см. прокомментированные строки):

<?php

$arr = array(
    0 => array (
        'name'   => 'Friday',
        'weight' => 6,
    ),
    1 => array (
        'name'   => 'Monday',
        'weight' => 2,
    ),
);

// sort by 'weight'
usort($arr, function($a, $b) { // anonymous function
    // compare numbers only
    return $a['weight'] - $b['weight'];

    // compare numbers or strings
    //return strcmp($a['weight'], $b['weight']);

    // compare numbers or strings non-case-sensitive
    //return strcmp(strtoupper($a['weight']), strtoupper($b['weight']));
});

var_export($arr);

/*
array (
    0 => array (
        'name'   => 'Monday',
        'weight' => 2,
    ),
    1 => array (
        'name'   => 'Friday',
        'weight' => 6,
    ),
)
*/

Ответ 4

Согласитесь с usort, я также иногда использую array_multisort (http://ca2.php.net/manual/en/function.usort.php) пример 3, сортируя результаты базы данных. Вы можете сделать что-то вроде:

<?php
$days = array(
  array('name' => 'Friday', 'weight' => 6),
  array('name' => 'Monday', 'weight' => 2),
);

$weight = array();
foreach($days as $k => $d) {
  $weight[$k] = $d['weight'];
}

print_r($days);

array_multisort($weight, SORT_ASC, $days);

print_r($days);
?>

Вывод:

Array
(
    [0] => Array
        (
            [name] => Friday
            [weight] => 6
        )

    [1] => Array
        (
            [name] => Monday
            [weight] => 2
        )

)
Array
(
    [0] => Array
        (
            [name] => Monday
            [weight] => 2
        )

    [1] => Array
        (
            [name] => Friday
            [weight] => 6
        )

)

Ответ 5

Вы также можете использовать анонимную функцию.

usort($items, function($a, $b) {
    return $a['name'] > $b['name'];
});

Ответ 6

Если поданная вами сортировка является строкой типа title name,
array_multisort + Флаги для Естественная сортировка и CaseInSensitivity:

$sort_by_title = array();
foreach($items as $item) {
  $sort_by_title [] = $item['title'];
}
array_multisort($sort_by_title , SORT_ASC, SORT_NATURAL | SORT_FLAG_CASE, $items );

Ответ 7

ПРИМЕЧАНИЕ. Если элемент, который вы сортируете, является поплавком типа .0534 и .0353 (например, для процента), тогда вам нужно умножить на 1000. Не уверен, почему, откровенно говоря... кажется, что usort кажется сравните целочисленные значения.

взял меня немного, чтобы понять, что один из них...

и 2 подсказки, которые могут быть не сразу очевидны:

  • Если ваши массивы являются объектами, вы можете использовать return $a- > weight - $b- > weight course
  • если вы вернетесь весом $b- > weight - $a- > , он отсканируется.

Ответ 8

Здесь классная функция, которая может помочь:

function subval_sort($a,$subkey,$sort) {
    foreach($a as $k=>$v) {
        $b[$k] = strtolower($v[$subkey]);
    }
    if($b)
    {
        $sort($b);
        foreach($b as $key=>$val) {
            $c[] = $a[$key];
        }
        return $c;
    }
}

Отправить в массив как $a ключ как $subkey и 'asort' или 'sort' для переменной $sort