1

ここでの大きな頭痛の種です。キーと値の両方を繰り返し処理し、ポインターを操作して、配列キーの整数の違いを比較するのに疲れています。1より大きい配列キーの減算に基づいてこの配列を分割および配置しようとしていますが、この質問の下部で説明されているように、値をクラスターに分離する有効な方法として、これに早くから気づきました。

例:([0] => cat [2]=>フルーツ[3]=>アップル)キーは次のようになります。

2番目-1番目のキー:2-0 = 2(2> 1)

3番目-2番目のキー:3-2 = 1(1 = 1)

質問の最後に、私が達成しようとしていることを簡潔に説明しました。

以下の配列コード:

$arr1 = array("cat", "Van", "fruit", "apple", "orange", "banana", "car", "car", "boat", "Bike", "truck", "cat", "dog", "bus", "van", "truck", "Sea", "ocean", "sea", "ship", "train", "Land");
$arr2 = array("cat", "fruit", "apple", "orange", "banana", "cat", "dog", "sea", "ocean", "land");
$array = array_uintersect($arr1, $arr2, 'strcasecmp');

//returns:

Array
(
    [0] => cat
    [2] => fruit
    [3] => apple
    [4] => orange
    [5] => banana
    [11] => cat
    [12] => dog
    [16] => Sea
    [17] => ocean
    [18] => sea
    [21] => Land
)

(以下)は、この質問の下部で説明されているように、分離しようとした実装としてこれまでに作成したコードです。

$arr1 = array("cat", "Van", "fruit", "apple", "orange", "banana", "car", "car", "boat", "Bike", "truck", "cat", "dog", "bus", "van", "truck", "Sea", "ocean", "sea", "ship", "train", "Land");
$arr2 = array("cat", "fruit", "apple", "orange", "banana", "cat", "dog", "sea", "ocean", "land");
foreach($array as &$val){
$array2 = $array;
prev($array);
if(key($array2)-key($array)!==1) { //bool to determine if the difference in keys is only 1 integer apart. 
$val = array($val);
$val[] = "";
}}
unset($val);
print_r(collapse_multi_arrays($array)); //collapse_multi_arrays is a custom function I have to form a single array from multidimensional ones. 

outputs:
Array
(
    [0] => cat
    [1] => 
    [2] => fruit
    [3] => apple
    [4] => orange
    [5] => banana
    [6] => 
    [7] => cat
    [8] => dog
    [9] => 
    [10] => Sea
    [11] => ocean
    [12] => sea
    [13] => 
    [14] => Land
    [15] => 
)

(上記の出力)配列を反復処理するのが最も賢明な方法かどうかはわかりませんが、次のようなものを取得するために、空の値を使用してチャンクまたは分割する必要があります。

Array
(
    [0] => Array
        (
            [0] => cat
        )

    [1] => Array
        (
            [2] => fruit
            [3] => apple
            [4] => orange
            [5] => banana
        )

    [2] => Array
        (
            [11] => cat
            [12] => dog
        )

    [3] => Array
        (
            [16] => Sea
            [17] => ocean
            [18] => sea
        )

    [4] => Array
        (
            [21] => Land
        )

)

これは、各クラスターに次のようにそれぞれ1つの値を追加できると思います。

Array
(
    [0] => cat
    [1] => fruit apple orange banana
    [2] => cat dog
    [3] => Sea ocean sea
    [4] => Land

)

// ================================================ ========

全体的な説明:私が全体的にやろうとしていることは、次のようなものです。

これから:

Array
(
    [0] => cat
    [2] => fruit
    [3] => apple
    [4] => orange
    [5] => banana
    [11] => cat
    [12] => dog
    [16] => Sea
    [17] => ocean
    [18] => sea
    [21] => Land
)

これに:

Array
(
    [0] => cat
    [1] => fruit apple orange banana
    [2] => cat dog
    [3] => Sea ocean sea
    [4] => Land

)

これは、配列キーの差が1整数だけ離れている場合に、配列値をクラスターで追加することです。配列キーの整数の差が1より大きい場合、上記の例の「この*からこの*キー値へ」のように、クラスターに追加された配列値が次の配列キーに渡されます

この目標を達成するためにキーと値の両方を繰り返すのは難しいと感じているので、助け、アドバイス、コードは最もありがたいです、乾杯。

4

1 に答える 1

0

私の頭に浮かぶのは、次のような単純な解決策です(テストされ、必要な結果が得られます)。

$a = array(
    0 => 'cat',
    2 => 'fruit',
    3 => 'apple',
    4 => 'orange',
    5 => 'banana',
    11 => 'cat',
    12 => 'dog',
    16 => 'Sea',
    17 => 'ocean',
    18 => 'sea',
    21 => 'Land',
);

$last = 0;
$stack = $grouped = array();
foreach ($a as $key => $val) {
    if ($key - $last > 1) {
        $grouped[] = implode(' ', $stack);
        $stack = array();
    }
    $stack[] = $val;
    $last = $key;
}
$grouped[] = implode(' ', $stack);
print_r($grouped);

奇妙に見えるので、ここで何を達成しようとしているのかわかりません;)解決しようとしている根本的な問題が何であれ、これよりもエレガントな解決策があると思います。

于 2012-04-28T03:58:39.713 に答える