0

多次元配列を通常の配列に縮小する際にいくつか問題があります。

私はこのような入力配列を持っています:

Array
(
[0] => Array (
        [0] => 17
        [1] => 99
    )
[1] => Array (
        [0] => 17
        [1] => 121
    )
[2] => Array (
        [0] => 99
        [1] => 77
    )
[3] => Array (
        [0] => 45
        [1] => 51
    )
[4] => Array (
        [0] => 45
        [1] => 131
    )

したがって、値が重複している多次元配列(17,99と17,121など)があります。次に、次のような出力が必要です。

Array
(
[0] => Array (
        [0] => 17
        [1] => 99
        [2] => 121
        [3] => 77
    )
[2] => Array (
        [0] => 45
        [1] => 51
        [3] => 131
    )

この方法でデータベース内の同じ記事を保存したいと思います。出力配列shpuldは引き続き多次元配列ですが、2番目のレベルのすべての数値は配列内で一意である必要があります。

私はこれを1週間以上解決しようとしていますが、うまくいきません。私はそれが簡単であるべきだと知っています...しかしとにかく-私はそれを取得しません:D

これは私がこれまでに得たものです:

$parity_sorted = array();
    foreach($arr as $key => $a){
        if(count($parity_sorted) > 0){
        foreach($parity_sorted as $key2 => $arr_new){
            if(in_array($a[0], $arr_new) || in_array($a[1], $arr_new)){
                if(!in_array($a[0], $arr_new)){array_push($parity_sorted[$key2], $a[0]);}
                if(!in_array($a[1], $arr_new)){array_push($parity_sorted[$key2], $a[1]);}
            } else {
                array_push($parity_sorted, array($a[0],$a[1]));
            }
        }
        } else {
            array_push($parity_sorted, array($a[0],$a[1]));
        }

    }

あなたはすでにこのような問題を解決したのでしょうか、それとももっと簡単な方法がありますか?多分私はあまりにも複雑だと思います(これは私の最初の試みではありませんが、このコードは最後の試みでした)

どんな助けでもいただければ幸いです。どうもありがとう

4

5 に答える 5

1

これは、あなたのコメントと期待どおりに動作するデモを考慮して、私の修正されたコードです。( http://codepad.org/CiukXctS )

<?php

$tmp = array();
foreach($array as $value)
{
    // just for claraty, let's set the variables
    $val1 = $value[0];
    $val2 = $value[1];
    $found = false;
    foreach($tmp as &$v)
    {
        // check all existing tmp for one that matches
        if(in_array($val1, $v) OR in_array($val2, $v))
        {
            // this one found a match, add and stop
            $v[] = $val1;
            $v[] = $val2;
            // set the flag
            $found = true;
            break;
        }
    }
    unset($v);

    // check if this set was found  
    if( ! $found)
    {
        // this variable is new, set both
        $tmp[] = array(
                $val1,
                $val2,
                );
    }
}

// go trough it all again to ensure uniqueness
$array = array();
foreach($tmp as $value)
{
    $array[] = array_unique($value); // this will eliminate the duplicates from $val2
}

オリジンアンサー

質問はひどく尋ねられていますが、質問が何であると私が信じているかに答えようとします.

ペアの最初の値が同じ配列のすべてのペアを収集しますか?

$tmp = array();
for($array as $value)
{
    // just for claraty, let's set the variables
    $val1 = $value[0];
    $val2 = $value[1];

    if(isset($tmp[$val1])) // we already found it
    {
        $tmp[$val1][] = $val2; // only set the second one
    }
    else
    {
        // this variable is new, set both
        $tmp[$val1] = array(
            $val1,
            $val2,
        );
    }
}
// go trough it all again to change the index to being 0-1-2-3-4....
$array = array();
foreach($tmp as $value)
{
    $array[] = array_unique($value); // this will eliminate the duplicates from $val2
}
于 2012-11-06T20:59:47.173 に答える
0

(コード例:http ://codepad.org/rJNNq5Vd )

私はあなたを理解していると心から信じています。もしそうなら、あなたが探しているのはここです。

function arrangeArray($array) {
    $newArray = array(array_shift($array));

    for ($x = 0; $x < count($newArray); $x++) {
        if (!is_array($newArray[$x])) {
            unset($newArray[$x]);
            return $newArray;
        }
        for ($i = 0; $i < count($newArray[$x]); $i++) {
            foreach ($array as $key => $inArray) {
                if (in_array($newArray[$x][$i], $inArray)) {
                    $newArray[$x] = array_unique(array_merge($newArray[$x], $inArray));
                    unset($array[$key]);
                }
            }
        }
        $newArray[] = array_shift($array);
    }
}

どちらが返されますか:

array(2) {
  [0]=>
  array(4) {
    [0]=>
    int(17)
    [1]=>
    int(99)
    [2]=>
    int(121)
    [4]=>
    int(77)
  }
  [1]=>
  array(3) {
    [0]=>
    int(45)
    [1]=>
    int(51)
    [3]=>
    int(131)
  }
}

にとって:

var_dump(arrangeArray(array(
    array(17,99),
    array(17,121),
    array(99,77),
    array(45, 51),
    array(45, 131),
)));

と:

array(1) {
  [0]=>
  array(6) {
    [0]=>
    int(17)
    [1]=>
    int(99)
    [2]=>
    int(121)
    [3]=>
    int(45)
    [4]=>
    int(77)
    [6]=>
    int(51)
  }
}

にとって:

var_dump(arrangeArray(array(
    array(17,99),
    array(17,121),
    array(99,77),
    array(45, 51),
    array(45, 17),
)));
于 2012-11-06T22:08:18.023 に答える
0

これが一般的なタスクの解決策です。

$data = array(array(17,99), array(17,121), array(99,77), array(45,51), array(45,131));
$result = array();
foreach ($data as $innner_array) {
    $intersect_array = array();
    foreach ($result as $key => $result_inner_array) {
        $intersect_array = array_intersect($innner_array, $result_inner_array);
    }
    if (empty($intersect_array)) {
        $result[] = $innner_array;
    } else {
        $result[$key] = array_unique(array_merge($innner_array,     $result_inner_array));
    }

}
var_dump($result);
于 2012-11-06T21:13:19.777 に答える
0

私はあなたの問題を理解していると思います。ちょっとやってみよう。

$firstElems = array();
$secondElems = array();
foreach ( $arr as $v ) {
    $firstElems[ $v[0] ] = array( $v[0] );
}
foreach ( $arr as $v ) {
    $secondElems[ $v[1] ] = $v[0];
}

foreach ( $arr as $v ) {
    if ( isset( $secondElems[ $v[0] ] ) ) {
        array_push( $firstElems[ $secondElems[ $v[0] ] ], $v[1] );
    }
    else {
        array_push( $firstElems[ $v[0] ], $v[1] );
    }
}

foreach ( $firstElems as $k => $v ) {
    if ( isset( $secondElems[ $k ] ) ) {
        unset( $firstElems[ $k ] );
    }
}

出力:

Array
(
    [17] => Array
        (
            [0] => 17
            [1] => 99
            [2] => 121
            [3] => 77
        )

    [45] => Array
        (
            [0] => 45
            [1] => 51
            [2] => 131
        )

)
于 2012-11-06T21:58:39.693 に答える
0

試す:

$arr = array(array(17,99), 
            array(17,121),
            array(99,77),
            array(45, 51),
            array(45, 131)
      );

 foreach($arr as $v)
  foreach($v as $m)
    $new_arr[] = $m;

  $array = array_chunk(array_unique($new_arr), 4);
  var_dump($array);

デモ と を使用array_uniquearray_chunkます。

出力:

 array(2) { [0]=>array(4) { [0]=> int(17) [1]=>int(99)
            [2]=>int(121) [3]=> int(77) }
            [1]=> array(3) { [0]=> int(45) [1]=>int(51)
            [2]=>int(131) }
          }
于 2012-11-06T21:18:09.897 に答える