Привет! Есть массив: PHP: $teams[] = array( 'name' => 'Василий', 'age' => 17 ); $teams[] = array( 'name' => 'Владимир', 'age' => 16 ); $teams[] = array( 'name' => 'Анастасия', 'age' => 15 ); $teams[] = array( 'name' => 'Александр', 'age' => 16 ); Данные в массиве (возраст) практически всегда разный. Как правильно отсортировать массив по age, но при этом равномерно (или почти) распределить по двум сторонам(командам) ? Чтобы вышло: Первая команда age 17 + 15 ( суммарно 32 года ) Вторая команда age 16 + 16 ( суммарно 32 года ) * Важно, чтобы возраст первой команды не очень сильно превышал возраст второй Действующий пример БЕЗ сортировки по age PHP: shuffle($teams); $c_1 = array(); $c_2 = array(); for ( $i = 0; $i < sizeOf($teams); $i++) { if ( isset ($teams[$i] ) ) { if ($i%2==0) $c_1[] = $teams[$i]; else $c_2[] = $teams[$i]; } } var_dump($c_1); var_dump($c_2); p.s. Сортировку по age с помощью функции usort вышло сделать, но это мало что изменило. Просто распределяю по очереди, 17 в первую, 17 во вторую и так далее. PHP: usort($teams, function($x, $y) { return mt_rand(1,2) == 1 ? ( $x["age"] > $y["age"] ? 1 : ($x["age"] < $y["age"] ? -1 : 0) ) : ( $x["age"] > $y["age"] ? 1 : ($x["age"] < $y["age"] ? -1 : 0) ); }); С таким раньше не приходилось сталкиваться. Спасибо за возможную помощь и внимание.
https://php.ru/forum/search/2125212/?q=Сортировка+многомерного+массива+по+ключу&o=date --- Добавлено --- а.. 6ля
Да сортировать не проблема, можно решить. Если что, готов на международную карту сотню другую рублей дать за реализацию.
Спасибо за отклик! Приведу второй пример ( близок к истине ) PHP: $teams = array(); $teams[] = array( 'name' => 'Имя 5', 'age' => 14 ); $teams[] = array( 'name' => 'Имя 4', 'age' => 10 ); $teams[] = array( 'name' => 'Имя 1', 'age' => 12 ); $teams[] = array( 'name' => 'Имя 3', 'age' => 9 ); $teams[] = array( 'name' => 'Имя 2', 'age' => 13 ); $teams[] = array( 'name' => 'Имя 6', 'age' => 12 ); //- Сортируем по убыванию usort($teams, function($x, $y) { return ( $x["age"] < $y["age"] ? 1 : ($x["age"] > $y["age"] ? -1 : 0) ) ; }); //- Половина от всей суммы $half_summ = intval( array_sum( array_map( function($element){ return $element['age']; }, $teams) ) / 2 ); //- Группа 1 $c_1 = array(); //- Группа 2 $c_2 = array(); //- Сумма группы 1 $summ_1 = 0; //- Сумма группы 2 $summ_2 = 0; //- Перебираем отсортированный массив foreach ( $teams as $key => $val ) { if($summ_1 <= $summ_2 OR $summ_2 >= $half_summ ) { $c_1[] = $teams[$key]; $summ_1 += $val['age']; } else { $c_2[] = $teams[$key]; $summ_2 += $val['age']; } } unset( $teams, $key, $val ); var_dump($c_1); echo $summ_1; echo '<hr>'; var_dump($c_2); echo $summ_2; Но при такой сортировке всегда одни и те же лица в первой и второй группе. Немного не то, к сожалению
А если так, но людей надо побольше чтобы было видно разницу PHP: <?php $teams = array(); $teams[] = array( 'name' => 'Имя 5', 'age' => 14 ); $teams[] = array( 'name' => 'Имя 4', 'age' => 10 ); $teams[] = array( 'name' => 'Имя 1', 'age' => 12 ); $teams[] = array( 'name' => 'Имя 3', 'age' => 9 ); $teams[] = array( 'name' => 'Имя 2', 'age' => 13 ); $teams[] = array( 'name' => 'Имя 6', 'age' => 12 ); $count = count($teams); $numbers = range(0, $count-1); shuffle($numbers); $array = []; foreach ($numbers as $n) { $array[] = $teams[$n]; } usort($array, function($x, $y) { return ( $x["age"] < $y["age"] ? 1 : ($x["age"] > $y["age"] ? -1 : 0) ) ; }); //- Половина от всей суммы $half_summ = intval( array_sum( array_map( function($element){ return $element['age']; }, $teams) ) / 2 ); //- Группа 1 $c_1 = array(); //- Группа 2 $c_2 = array(); //- Сумма группы 1 $summ_1 = 0; //- Сумма группы 2 $summ_2 = 0; //- Перебираем отсортированный массив foreach ( $array as $key => $val ) { if($summ_1 <= $summ_2 OR $summ_2 >= $half_summ ) { $c_1[] = $array[$key]; $summ_1 += $val['age']; } else { $c_2[] = $array[$key]; $summ_2 += $val['age']; } } unset( $array, $key, $val ); var_dump($c_1); echo $summ_1; echo '<hr>'; var_dump($c_2); echo $summ_2;