PHP - не задан в многомерном массиве - PullRequest
12 голосов
/ 31 августа 2011

У меня есть массив $ 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
    )
)

и так далее ...

Когда я хочу удалить второй элемент, я просто использую

$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], ... ), чтобы получить следующее:

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
    )
)

Ответы [ 5 ]

18 голосов
/ 31 августа 2011

Невозможно сделать с помощью простой команды, но вы можете использовать цикл:

foreach(array_keys($output) as $key) {
   unset($output[$key][1]);
}
7 голосов
/ 31 августа 2011

Вы можете перебирать массив и unset() то, что вы хотите в каждом подмассиве:

foreach($output as &$item) {
    unset($item[2]);
}
unset($item); // unset reference
4 голосов
/ 31 августа 2011

В чистоте и порядке:

$f=function(&$a,$k) { unset $a[1]; };
array_walk($arr,$f);
2 голосов
/ 31 августа 2011

Вы бы использовали комбинацию array_map и array_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 голосов
/ 31 августа 2011
foreach($array as $key=>$val){ unset($val[1]); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...