web-dev-qa-db-ja.com

多次元配列から「列」を削除する最良の方法

私はこのようなテーブルを表す多次元のphp配列を持っています

-------------
| A | 0 | A |
|---|---|---|
| 0 | 0 | 0 |
|---|---|---|
| A | 0 | A |
-------------

したがって、配列は次のようになります。

array (size=3)
  0 => 
    array (size=3)
      0 => string 'A' (length=1)
      1 => string '0' (length=1)
      2 => string 'A' (length=1)
  1 => 
    array (size=3)
      0 => string '0' (length=1)
      1 => string '0' (length=1)
      2 => string '0' (length=1)
  2 => 
    array (size=3)
      0 => string 'A' (length=1)
      1 => string '0' (length=1)
      2 => string 'A' (length=1)

次に、2番目の行と2番目の列を削除します(これは単純化された例です)。
行の削除は簡単です。

array_splice($array, 1, 1);

このアプローチを見つけました しかし、列を削除するより簡単な方法(行と同様)があるかどうか疑問に思っていましたか?たぶん、最初に配列を転置しますか?

13
Horen

これを試して:

function delete_row(&$array, $offset) {
    return array_splice($array, $offset, 1);
}

function delete_col(&$array, $offset) {
    return array_walk($array, function (&$v) use ($offset) {
        array_splice($v, $offset, 1);
    });
}

Ideoneでテスト済み: http://ideone.com/G5zRi

編集(アマデ):

delete_col関数を少し変更して、列が欠落している配列を処理することもできます。

function delete_col(&$array, $key) {
    return array_walk($array, function (&$v) use ($key) {
        unset($v[$key]);
    });
}

これは、例えば使用することができます。配列を反復処理し、各ステップでいくつかの列を削除する必要がある場合。 unsetの代わりにarray_spliceを使用する関数は、このようなシナリオでは適切ではありません。 (これはオフセットベースであり、キーベースではありません)。

17
mpyw

PHP array_walk() 状態のマニュアル(強調を追加):

配列のvaluesのみが変更される可能性があります。その構造は変更できません、つまり、プログラマーは追加、設定解除、または並べ替えができません要素。コールバックがこの要件を尊重しない場合、この関数の動作はundefined、およびunpredictable

それは、 mpywとAmadeの答え は機能するかもしれないが、信頼できないかのように私には聞こえます。

より安全な解決策は次のとおりです。

function delete_col(&$array, $key)
{
    // Check that the column ($key) to be deleted exists in all rows before attempting delete
    foreach ($array as &$row)   { if (!array_key_exists($key, $row)) { return false; } }
    foreach ($array as &$row)   { unset($row[$key]); }

    unset($row);

    return true;
}
2
Tanathon