web-dev-qa-db-ja.com

PHP-多次元配列で設定解除

私はこの配列$ outputを持っています。これは次のようになります。

Array(
    [0] => Array(
        [0] => 1a
        [1] => 1b
        [2] => 1c
    )
    [1] => Array(
        [0] => 2a
        [1] => 2b
        [2] => 2c
    )
    [2] => Array(
        [0] => 3a
        [1] => 3b
        [2] => 3c
    )
    [3] => Array(
        [0] => 4a
        [1] => 4b
        [2] => 4c
    )
)

等々...

2番目の要素を削除したいときは

$output = unset($output[1]);

以下を取得するには:

Array(
    [0] => Array(
        [0] => 1a
        [1] => 1b
        [2] => 1c
    )
    [1] => Array(
        [0] => 3a
        [1] => 3b
        [2] => 3c
    )
    [2] => Array(
        [0] => 4a
        [1] => 4b
        [2] => 4c
    )
)

私の質問は、配列内のすべての要素([0] [1]、[1] [1]、[2] [1]、[3] [1]、...)の1つおきの要素を削除して取得する方法です。以下:

Array(
    [0] => Array(
        [0] => 1a
        [1] => 1c
    )
    [1] => Array(
        [0] => 2a
        [1] => 2c
    )
    [2] => Array(
        [0] => 3a
        [1] => 3c
    )
    [3] => Array(
        [0] => 4a
        [1] => 4c
    )
)
13
Giel

単純なコマンドでは実行できませんが、ループを使用できます。

foreach(array_keys($output) as $key) {
   unset($output[$key][1]);
}
19
Marc B

配列を反復処理し、各サブ配列に必要なものをunset()することができます。

foreach($output as &$item) {
    unset($item[2]);
}
unset($item); // unset reference
8
Arnaud Le Blanc

清潔できれい:

$f=function(&$a,$k) { unset $a[1]; };
array_walk($arr,$f);
6
dnagirl
foreach($array as $key=>$val){ unset($val[1]); }
2
FabioG

array_maparray_spliceの組み合わせを使用します。

function removeSecond( array &$arr )
{
    array_splice( $arr, 1, 1 );
}
$out = array_map( 'removeSecond', $input );

unsetの問題は、インデックスがそのまま残ることです。

$ php -r '$arr = array(array(0,1,2)); unset($arr[0][1]); var_dump($arr);'
array(1) {
  [0]=>
  array(2) {
    [0]=>
    int(0)
    [2]=>
    int(2)
  }
}

スプライスはインデックスを更新しますが、

$ php -r '$arr = array(array(0,1,2)); array_splice($arr[0], 1, 1); var_dump($arr);'
array(1) {
  [0]=>
  array(2) {
    [0]=>
    int(0)
    [1]=>
    int(2)
  }
}
2
cwallenpoole