鍍金池/ 問答/人工智能  PHP/ php實(shí)現(xiàn)包裹分配算法實(shí)現(xiàn)

php實(shí)現(xiàn)包裹分配算法實(shí)現(xiàn)

有如下2個(gè)數(shù)組:p代表人,b代表包裹

$arr1 = [p1, p2, p3, p4, p5, p6, p7];
$arr2 = [b1, b2, b3, b4, b5, b6 ,b7 ,b8, b9 ,b10];

將10個(gè)包裹一次分配給7個(gè)人,第一次分配將7個(gè)包裹分給了前7個(gè)人,剩下的3個(gè)再依次分給前3個(gè)人;如何實(shí)現(xiàn)?

回答
編輯回答
法克魷
<?php 
/**
 * 分配函數(shù)
 *
 * @author Flc  <2017-12-07 22:14:12>
 * @link   http://flc.ren
 * @param  array  $couriers 快遞員
 * @param  array  $packages 包裹
 * @return array            key為快遞員;值為包裹
 */
function dist($couriers = [], $packages = [])
{
    $couriers      = array_values($couriers);
    $packages      = array_values($packages);
    $courier_count = count($couriers);

    $result = [];

    foreach ($packages as $key => $package) {
        $remainder = ($key + 1) % $courier_count;

        $sub = ($remainder ?: $courier_count) - 1;
            
        $result[$couriers[$sub]][] = $package;
    }

    return $result;
}

$arr1 = ['p1', 'p2', 'p3', 'p4', 'p5', 'p6', 'p7'];
$arr2 = ['b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'b10'];

print_r(dist($arr1, $arr2));

結(jié)果如下:

Array
(
    [p1] => Array
        (
            [0] => b1
            [1] => b8
        )

    [p2] => Array
        (
            [0] => b2
            [1] => b9
        )

    [p3] => Array
        (
            [0] => b3
            [1] => b10
        )

    [p4] => Array
        (
            [0] => b4
        )

    [p5] => Array
        (
            [0] => b5
        )

    [p6] => Array
        (
            [0] => b6
        )

    [p7] => Array
        (
            [0] => b7
        )

)
2018年9月23日 19:14
編輯回答
風(fēng)畔
$arr1 = ['p1', 'p2','p3','p4','p5','p6','p7'];
$arr2 = ['b1', 'b2','b3','b4','b5','b6','b7','b8','b9','b10','b11', 'b12','b13','b14','b15','b16','b17','b18','b19','b20'];
       
$num = floor(count($arr2) / count($arr1));
$arr3 = [];
foreach ($arr1 as $key => $value) {
    for($i = 0;$i < $num;$i++){
        $ind = $key + $i * count($arr1);
            $arr3[$key][] = $arr2[$ind];
            
     }
 }

$yushu = count($arr2) % count($arr1);
for($n = 0;$n < $yushu;$n ++){
    $nu = $n  + $num *  count($arr1);
    $arr3[$n][] = $arr2[$nu];
}

var_dump($arr3);


/*array(7) {
              [0] => array(3) {
                [0] => string(2) "b1"
                [1] => string(2) "b8"
                [2] => string(3) "b15"
              }
              [1] => array(3) {
                [0] => string(2) "b2"
                [1] => string(2) "b9"
                [2] => string(3) "b16"
              }
              [2] => array(3) {
                [0] => string(2) "b3"
                [1] => string(3) "b10"
                [2] => string(3) "b17"
              }
              [3] => array(3) {
                [0] => string(2) "b4"
                [1] => string(3) "b11"
                [2] => string(3) "b18"
              }
              [4] => array(3) {
                [0] => string(2) "b5"
                [1] => string(3) "b12"
                [2] => string(3) "b19"
              }
              [5] => array(3) {
                [0] => string(2) "b6"
                [1] => string(3) "b13"
                [2] => string(3) "b20"
              }
              [6] => array(2) {
                [0] => string(2) "b7"
                [1] => string(3) "b14"
              }
            }*/
2018年9月3日 23:02
編輯回答
互擼娃
<?php
$arr1 = ['p1', 'p2','p3','p4','p5','p6','p7'];
$arr2 = ['b1', 'b2','b3','b4','b5','b6','b7','b8','b9','b10','b11', 'b12','b13','b14','b15','b16','b17','b18','b19','b20'];

if(count($arr1) >= count($arr2)){  //若快遞員人數(shù)比包裹多,直接循環(huán)分配
    foreach ($arr2 as $key => $value) {
        $arr3[$key][] = $value;
    }
}else{  //包裹比快遞員人數(shù)多
    
    $num1 = floor(count($arr2)/count($arr1));   //取整
    $num2 = count($arr2)%count($arr1);   //得到剩余的包裹數(shù)量(求余數(shù))
    for($i=1;$i<=$num1;$i++){
            $s_num = count($arr1)*($i-1); //切割起始位置
            $arr3[] = array_slice($arr2,$s_num,count($arr1)); //切割
    }

        $arr3[$num1][] = array_slice($arr2,$s_num+count($arr1),$num2); //剩余包裹分發(fā)

}


var_dump($arr3);
?>
2018年5月14日 11:29