Удалить первые уровни идентификатора в массиве - PullRequest
7 голосов
/ 28 февраля 2012

Я думаю, что это было раньше, но не смог найти никакого ответа на это.Если ответ уже получен, укажите ссылку в правильном направлении.

У меня есть массив, в котором я не хочу удалять первые уровни идентификатора.Я думаю, что есть функция для этого?

Пример того, как это:

[0] => Array
        (
            [8] => Röd
        )

[1] => Array
        (
            [8] => Blå
        )

[2] => Array
        (
            [6] => Bobo
        )

[3] => Array
        (
            [8] => Grön
        )

[4] => Array
        (
            [7] => Sten
        )

[5] => Array
        (
            [8] => Vit
        )

[6] => Array
        (
            [7] => Guld
        )

[7] => Array
        (
            [6] => Lyxig
        )

Что я не хочу

[8] => Röd
[8] => Blå
[6] => Bobo
[8] => Grön
[7] => Sten
[8] => Vit
[7] => Guld
[6] => Lyxig

Ответы [ 7 ]

12 голосов
/ 28 февраля 2012

Проблема здесь заключается в сохранении ключей для нужного идентификатора. У вас есть несколько именных строк с одинаковым ключом (например, Blå и Röd). Вам либо нужно хранить их в массиве, либо вы готовы потерять ключ.

Пример с php5.3:

$processed = array_map(function($a) {  return array_pop($a); }, $arr);

Это даст вам:

[0] => Röd
[1] => Blå
[2] => Bobo
[3] => Grön
[4] => Sten
[5] => Vit
[6] => Guld
[7] => Lyxig

Стало ясно, что ключи во внутреннем массиве должны быть сохранены, потому что они являются своего рода идентификатором. С учетом сказанного вы должны изменить конечную структуру, к которой вы стремитесь, потому что вы можете иметь 2 одинаковых ключа в одном массиве. Самая простая структура становится:

[8] => Array
        (
            [0] => Röd,
            [1] => Blå,
            [2] => Vit,
            [3] => Grön
        )

[6] => Array
        (
            [0] => Bobo,
            [1] => Lyxig
        )

[7] => Array
        (
            [0] => Sten,
            [1] => Guld
        )

Чтобы получить эту структуру, будет работать простой цикл:

$processed = array();
foreach($arr as $subarr) {
   foreach($subarr as $id => $value) {
      if(!isset($processed[$id])) {
         $processed[$id] = array();
      }

      $processed[$id][] = $value;
   }
}
5 голосов
/ 27 сентября 2016

PHP array_column

$new_array = array_column($old_array,0);

При этом будет получено значение с индексом 0 для каждого массива в $ old_array. Может также использоваться с ассоциативными массивами.

4 голосов
/ 11 декабря 2017

Попробуйте объединить массив с помощью оператора splat:

   print_r(array_merge(...$array));
1 голос
/ 28 февраля 2012

использование:

  public function remove_level($array) {
      $result = array();
      foreach ($array as $key => $value) {
        if (is_array($value)) {
          $result = array_merge($result, $value);
        }
      }
      return $result;
}

, который будет возвращать значения массива второго уровня в том же порядке, что и исходный массив. или вы можете использовать array_walk

   $results = array();
   array_walk($array, function($v, $k) use($key, &$val){
              array_merge($results, $v);
    });
0 голосов
/ 13 февраля 2019

Код ниже также приведет к тому же результату.

$resultArray = array_map('current',$inputArray);

OR

$resultArray = array_map('array_pop',$inputArray);

Примечание : Я проигнорировал ключи ожидаемого результата OP. Потому что невозможно иметь одинаковые ключи в массиве. Последний ключ заменит предыдущий, если тот же.

0 голосов
/ 28 февраля 2012

Проверьте, что это ожидаемый результат

<?php
$arrData = array(
"5" => array
        (
            "8" => "Vit"
        ),

"6" => array
        (
            "7" => "Guld"
        )
);
foreach($arrData as $key=>$value):
    foreach($value as $k=>$v):
     $data[$k] = implode(',',$arrData[$key]);
    endforeach;
endforeach;


print_r($data);
?>
0 голосов
/ 28 февраля 2012
foreach($array as $key=>$val) { 
  $newarr[$val] = $array[$key][$val]; 
} 

не проверено!

...