1

私は次の配列を持っています:

Array
    (
        [0] => 10-7
        [1] => 11-3
        [2] => 11-7
        [3] => 12-3
        [4] => 12-7
        [5] => 13-3
        [6] => 13-7
        [7] => 14-3
        [8] => 14-7
        [9] => 15-7
    )

"-"区切り文字として使用して2つの配列に分割する必要があります。

Array
    (
        [0] => 10
        [1] => 11
        [2] => 11
        [3] => 12
        [4] => 12
        [5] => 13
        [6] => 13
        [7] => 14
        [8] => 14
        [9] => 15
    )

Array
    (
        [0] => 7
        [1] => 3
        [2] => 7
        [3] => 3
        [4] => 7
        [5] => 3
        [6] => 7
        [7] => 3
        [8] => 7
        [9] => 7
    )

私が欲しいものはそのようなものはありarray_explodeますか?またはphparray関数の組み合わせ?for可能であれば、自分の/eachループを経由せずにこれを実行するか、少なくとも、組み込みの(疑似)何かがすでに存在する場合に車輪の再発明を行う必要性を最小限に抑えたいと思います。私はすでにforループでこれを行いました。しかし、配列関数などをスマートに使用する、よりエレガントな方法があるという感覚を揺るがすことはできません。どうもありがとう、みんな。

追加情報:

それが重要かどうかはわかりませんが、実際には、結果の2つの配列の一意の値を求めています。

Array
    (
        [0] => 10
        [1] => 11
        [2] => 12
        [3] => 13
        [4] => 14
        [5] => 15
    )

Array
    (
        [0] => 7
        [1] => 3
    )

一意の値を並べ替える必要はありません。キーは保持されるかどうかに関係なく、最初の配列の有効な値はから0まで23の範囲で、2番目の配列の有効な値はから1まで7です。ただし、これら以外の値(0to23および1to 7、あるいは無制限の漂遊文字列または私の制御できない他のデータ型)を持つことは可能であり、これは間違いなく破棄したいと思います。

4

5 に答える 5

3

あなたが探している魔法の弾丸はarray_reduce()、例えば(PHP 5.3+)です:

list( $left, $right ) = array_reduce( $input,
  function( $memo, $item ) {
    list( $l, $r ) = explode( '-', $item );
    $memo[0][$l] = $memo[1][$r] = true;
    return $memo;
  },
  array( array(), array() )
);

var_dump( array_keys( $left ), array_keys( $right ) );

ここで実際の動作を見ることができます。

PHP <5.3 では、事前に関数を宣言する必要があります。

function my_reducer( $memo, $item ) {
  list( $l, $r ) = // ...
  // ... as above ...
}

list( $left, $right ) = array_reduce(
  $input, 'my_reducer',
  array( array(), array() )
);
于 2012-05-23T06:13:50.993 に答える
2

http://codepad.org/TpVUIhM7

<?php
    $array = array('7-10','7-11','5-10');
    foreach($array as $a){list($x[], $y[]) = explode("-", $a);}
    print_r(array_unique($x));
    print_r(array_unique($y));
?>
于 2012-05-23T06:08:51.403 に答える
0

これがあなたのソリューションです。次のコードを実装してみてください。

あなたのために働くはずです。

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

foreach($main_array as $key=>$value)
{
    $arr_value      =   explode('-',$value);
    $arr_temp1[]    =   $arr_value[0];
    $arr_temp2[]    =   $arr_value[1];  
}
$arr_temp1_unique   = array_unique($arr_temp1);
$arr_temp2_unique   = array_unique($arr_temp2);


print "<pre>";
print_r($main_array);
print_r($arr_temp1);
print_r($arr_temp2);

print_r($arr_temp1_unique);
print_r($arr_temp2_unique);
print "</pre>";
于 2012-05-23T06:05:56.770 に答える
0

私の知る限り、この状況で使用できる適切な PHP 関数はありません。

array_walk()およびのような関数array_map()は、複数の配列ではなく、単一の配列になります。

あなたはすでにループで解決策を試したと言いましたが、助けるために、これを解決する方法は次のとおりです。

//$data contains the array you want to split
$firstItems = array();
$secondItems = array();

foreach($data as $item)
{
    list($first, $second) = explode('-', $item, 2);
    $firstItems[$first] = true;
    $secondItems[$second] = true;    
}

//Now you can get the items with array_keys($firstItems) and array_keys($secondItems);

set値の代わりにキーを設定することで、PHP 配列を として扱っています。これによりarray_unique()、ユニークなアイテムを取得するために使用する必要がなくなります。

于 2012-05-23T06:06:32.090 に答える