-5

配列があるとします

$x= ('A'=>31, 'B'=>12, 'C'=>13, 'D'=>25, 'E'=>18, 'F'=>10);

このような配列を生成する必要があります

$newx = (0 => array('A'=>31 , 'B' =>1) , 1 => array('B'=>11 , 'C' =>13 , 'D'=>8) , 2 =>array('D'=>17 , 'E'=>15) , 3=>array('E'=>3,'F'=>10);

この場合、 の各値は で$newxある必要が= 32あり、これがどのように機能するかです$x[A] = 31 , $x[B] = 12。最初に、新しい配列のインデックスを同じに保ちながら、合計数量を 32 にする必要があります。

array(0=>array('A'=>31,'B'=>1) , 1=>array('B'=>11) )

このプロセスは、$x の値ごとに続行する必要があります。

4

1 に答える 1

0

これは宿題だと確信していますが、実際には独自のコードを提供する必要があります。少なくとも試してみてください。面白いと思ったので、先に進んで試してみました。私は彼に反対票を投じられると思いますし、おそらくそれに値するでしょうが、とにかくここに行きます.

あなたがする必要があるのは:

  1. 配列をループし、
  2. 32 を与える要素を決定し、その結果を最終的な配列に格納します。
  3. 作業配列の対応する要素から結果の最後の要素の値を減算します
  4. 次に、まだ作業している配列の最初の要素が、最後の結果が返した最後の要素と等しくなるまで、最初の要素を削除して、配列を縮小します。
  5. 最後の結果が 32 未満の場合は終了します。

これを念頭に置いて、コードをコピーして貼り付けるだけでなく、最初に自分で解決策を見つけてみてください。:)

<?php

$x = array('A'=>31, 'B'=>12, 'C'=>13, 'D'=>25, 'E'=>18, 'F'=>10);
$result = array();


function calc($toWalk){
// walk through the array until we have gathered enough for 32, return result as   an array
$result = array();

foreach($toWalk as $key => $value){
    $count = array_sum($result);
    if($count >= 32){
        // if we have more than 32, subtract the overage from the last array element
        $last = array_pop(array_keys($result));
        $result[$last] -= ($count - 32);
        return $result;  
    }
    $result[$key] = $value;
}
return $result; 
}


// logic match first element
$last = 'A';
// loop for as long as we have an array
while(count($x) > 0){

/* 
we make sure that the first element matches the last element of the previously found array
so that if the last one went from A -> C we start at C and not at B
*/
$keys = array_keys($x);
if($last == $keys[0]){
    // get the sub-array
    $partial = calc($x);
    // determine the last key used, it's our new starting point
    $last = array_pop(array_keys($partial));
    $result[] = $partial;




            //subtract last (partial) value used from corresponding key in working array
            $x[$last] -= $partial[$last];

    if(array_sum($partial) < 32) break;
}
/* 
    reduce the array in size by 1, dropping the first element
    should our resulting first element not match the previously returned
    $last element then the logic will jump to this place again and
    just cut off another element
*/
$x = array_slice($x , 1 );
}

print_r($result);
于 2012-06-10T00:14:47.453 に答える