-3

こんにちは私は再帰関数を使用して配列から値を削除するのに助けが必要です

$array = [0] => testing,testing1
[1] => testing,testing1,testing2
[2] => testing,testing1,testing2,testing3
[3] => testing,testing1,testing2,testing3,tesing4
[4] => testing,testing1,testing2,testing3,tesing4
[5] => testing,testing1,testing2,testing3,tesing4
[6] => testing,testing1,testing2,testing3,tesing4
[7] => testing,testing1,testing2,testing3,tesing4

配列数を確認する必要があります。if count(array[0]) == count(array[1]),then reutrn array else unset(array[value]);

array[0],[1],[2]上記の配列から、残りの配列値を削除して返す必要があります。

私は以下のコードを試しました

$idx =10;
$separtor =',';
function array_delete($idx, $array,$separtor) {
  $finalvalue = array();
for ($i = 0; $i < $idx; $i++) {
   $values = explode($separtor, $array[$i]);
   $valuesnext = explode($separtor, $array[$i+1]);
       if(count($values) != count($valuesnext) )
       {
            unset($array[$i]);
           // reset($array);
           // array_delete($idx, $array,$separtor);
            if (is_array($array)) $array = array_delete($idx, $array,$separtor);
            $finalvalue =  $array;
       }else
       {

       }
    //echo $i;

}
return $finalvalue;
//(is_array($array)) ? array_values($array) : null;
//array_delete($idx, $array,$separtor);
}

私は得ていますNotice: Undefined offset: 0 when trying calling recursive, going to infinite loop

4

3 に答える 3

1

アイテムが最も多いサブ配列を保持しますか?あなたの説明はこれを言っているようです。

もしそうなら、次のようなもので十分でしょう。

// Get maximum number of items in the arrays
$max_count = max(array_map('count', $array));

// Keep only those arrays having $max_count items
$filtered  = array_filter($array, function ($a) use ($max_count) {
    return count($a) === $max_count;
});

余談ですが、フィルター処理された配列にゼロベースのキーが必要な場合は、それを呼び出しますarray_values()

オンラインで実行されている例を参照してください。

于 2012-06-20T09:51:11.647 に答える
1

私が正しく理解している場合は、最終的な配列の値がソース配列の最後の要素と同じ長さになるように配列をフィルタリングする必要があります。反復中に配列が変更されないようにするために、この手法では、条件に一致する要素を使用して新しい配列を作成します。

$matchLength = count($mainArray[count($mainArray) - 1]);
$resultArray = array();
for($i = 0; $i < count($mainArray); $i++) {
    if(count($mainArray[$i]) == $matchLength) {
        $resultArray[] = $mainArray[$i];
    }
}

PHP 5.3以降を使用している場合は、クロージャとarray_filterを使用してこれをすばやく実行できます。

$matchLength = count($mainArray[count($mainArray) - 1]);
$resultArray = array_filter($mainArray, function($element){return count($element) == $matchLength});

コードを再確認してください。私は最近PHPを作成していないので、これは単なるアイデアです。

于 2012-06-19T03:35:30.207 に答える
1

あなたが与えた説明によると、それはちょうど作られる可能性があります(現在のものと過去のものの数を確認し、それらが一致しない場合は、前のものを削除してください)。

例/デモ

unset($prevKey);
$count = array();
foreach (array_keys($array) as $key) {
    $count[$key] = count($array[$key]);
    if (isset($prevKey) && $count[$prevKey] !== $count[$key]) {
        unset($array[$prevKey]);
    }
    $prevKey = $key;
}

削除を考慮に入れるために繰り返す必要がある場合は、小さなgotoでデモを実行できます。

start:
######
unset($prevKey);
$count = array();
foreach (array_keys($array) as $key) {
    $count[$key] = count($array[$key]);
    if (isset($prevKey) && $count[$prevKey] !== $count[$key]) {
        unset($array[$prevKey]);
        goto start;
        ###########
    }
    $prevKey = $key;
}
于 2012-06-19T19:19:56.140 に答える