0

このトピックについて投稿するのはこれで 3 回目です。ユーザーの馬場さんにはいつもお世話になっています。SO Web サイトにはユーザー メッセージ システムがないため (残念ながら)、投稿内で質問しています。また。

ユーザー Baba の助けを借りて、配列に別の配列が含まれているかどうかをチェックする関数を作成することができましたが、関数はそれを複数回決定し、インデックス リストを作成します。関数に欠けているものと知っておく必要があるのは、関数が期待どおりの例外で -1 を返さないことです。関数は関連のない値を返す可能性があり、関数は一貫していません。どの配列がメイン配列 ($leftArray) と一致するかを確認し、それらの配列のインデックスを返すだけです。一致する配列がない場合、関数は -1 を返す必要があります。

このコードを確認して、私を助けてください:

<?php
$leftArray = array(7,6,14,15,8,0,1,4,5,9); 
//contains $GroupOfFour[6] and $GroupOfFour[1], and some excess
//numbers. Function should return array(6,1), If there is not a
//matching case the function should return -1.
//i've realised that the exception cases and the multiple
//grouping does not work.

$GroupOfFour = array (
                     array(3,2,7,6),
                     array(7,6,15,14),
                     array(15,14,11,10),
                     array(1,3,5,7),
                     array(5,7,13,15),
                     array(13,15,9,11),
                     array(0,1,4,5),
                     array(4,5,12,13),
                     array(12,13,8,9),
                     array(0,4,12,8),
                     array(1,5,13,9),
                     array(3,7,15,11),
                     array(2,6,14,10),
                     array(0,1,3,2),
                     array(4,5,7,6),
                     array(12,13,15,14),
                     array(8,9,11,10),
                     array(0,2,8,10),
                     array(0,1,8,9),
                     array(1,3,9,11),
                     array(3,2,11,10),
                     array(0,4,2,6),
                     array(4,12,6,14),
                     array(12,14,8,10)
                     );

function searchFourTerms($leftArray, $GroupOfFour) {
    global $GroupOfFour, $leftArray;
    $len4 = count($leftArray);
    $len4_carry = count($leftArray);
    $list4 = array();
    for($i4 = 0; $i4 < count($GroupOfFour); $i4 ++) {
        $intercept4 = array_intersect($GroupOfFour[$i4], $leftArray);
        $len4 = count($intercept4);
        if (count($intercept4) % 4 == 0) {
            $list4[$i4] = $len4;
        }
    }
    arsort($list4);
    if (empty($list4) || ($len4_carry<4))
        return - 1;
    return key($list4);
}

?>
4

3 に答える 3

2

key($list4) は list4 の現在のインデックスのみを返します。あなたの場合、18が返されます。

これを試してみてください、それは私にとってはうまくいきました。key($list4) を返す代わりに、一致するインデックスの配列を返しました。

function searchFourTerms($la, $gof) {
$i3=0;
if(count($la)<4){
    return -1;
}
$list4 = array();
for($i4 = 0; $i4 < count($gof); $i4++) {
    $intercept4 = array_intersect($gof[$i4], $la);
    $len4 = count($intercept4);
    if(count($intercept4)==4) {
        $list4[$i3] = $i4;
        $i3++;
    }
}
if (empty($list4)){
    return - 1;
}
$list5= array();
$i7=0;
for($i4=0; $i4<count($list4); $i4++){
    $i6=0;
    for($i5=0; $i5<count($list4); $i5++){
        if($i4!=$i5){
            $i6+=count(array_intersect($gof[$i4], $gof[$i5]));
        }
    }
    if($i6<count($gof[$i4])){
        $list5[$i7]=$list4[$i4];
        $i7++;
    }
}
return $list5;
}

$leftArray = array(0,1,3,2,7,6,8,9) の場合、返された配列に対して var_dump を実行すると、次の配列が出力されます。[13] は、[0] からのすべての重複が含まれているため、除外されます。 [18]:

array(2) {
[0]=>
int(0)
[1]=>
int(18)
}
于 2012-10-22T18:04:35.687 に答える
0

複数のキーを返すために必要なのはこれだけです

var_dump(searchFourTerms($leftArray, $GroupOfFour));

出力 (すべてのグループが array_slice を使用して任意の 2 を選択)

array
  0 => int 18
  1 => int 1
  2 => int 14
  3 => int 6
  4 => int 20

変更した関数

function searchFourTerms($leftArray, $GroupOfFour) {
    $len4 = count($leftArray);
    $len4_carry = count($leftArray);
    $list4 = array();
    for($i4 = 0; $i4 < count($GroupOfFour); $i4 ++) {
        $intercept4 = array_intersect($GroupOfFour[$i4], $leftArray);
        $len4 = count($intercept4);
        if (count($intercept4) % 4 == 0) {
            $list4[$i4] = $len4;
        }
    }
    arsort($list4);
    if (empty($list4) || ($len4_carry < 4))
        return - 1;
    return array_keys($list4);
}
于 2012-10-22T20:56:25.513 に答える