Как объединить вложенные массивы на основе ключей? - PullRequest
0 голосов
/ 07 апреля 2019

PHP array

У меня есть массив, как показано на рисунке выше, я пытаюсь объединить все вложенные массивы на основе ключей, поэтому, например, сейчас есть 5 массивов с ключом 34. Мне нужен один массив с 34 ключами и 5 значениями. Как я могу этого достичь? Вот мой код.

    $proba = array();
while($row = $result->fetch(PDO::FETCH_ASSOC)){
    extract($row);
    if(!in_array($id, array_column($posts_arr['lokacije'], 'id'))) {
        $post_item = array(
            'id' => $id,
            'name' => $name,
            'state' => $state,
            'address' => $address,
            'phone' => $phone,
            'working_hours' => $working_hours,
            'description' => $description,
            'email' => $email,
            'fb_page' => $fb_page,
            'website' => $website,
            'additional_info' => $additional_info,
            'lat' => $lat,
            'lng' => $lng
        );
    array_push($posts_arr['lokacije'], $post_item);
    };

    array_push($proba, array($id => $naziv));
    $test = array_merge_recursive($proba, array($id => $naziv));
}
print_r($test);

Ответы [ 3 ]

1 голос
/ 07 апреля 2019
$proba = array();
while($row = $result->fetch(PDO::FETCH_ASSOC)){
    extract($row);

    //....

    if (empty($proba[$id])) {
        $proba[$id] = array();
    }
     $proba[$id][] = $naziv;
}

Также я не понимаю, почему вы используете extract - я полагаю, $post_item - это такое же , как $row.

1 голос
/ 07 апреля 2019

Я создал демо, как и у вас, вот код:

$arr = [
    [2 => 'A'],
    [34 => 'B'],
    [34 => 'C'],
    [34 => 'D'],
    [34 => 'E'],
    [34 => 'F'],
    [20 => 'G'],
];

$result = [];

foreach($arr as $a) {
    foreach($a as $key => $value) {
        array_key_exists($key, $result) ?
            $result[$key][] = $value:
            $result[$key] = [$value];
    }
}

Результат:

array(3) {
  [2]=>
  array(1) {
    [0]=>
    string(1) "A"
  }
  [34]=>
  array(5) {
    [0]=>
    string(1) "B"
    [1]=>
    string(1) "C"
    [2]=>
    string(1) "D"
    [3]=>
    string(1) "E"
    [4]=>
    string(1) "F"
  }
  [20]=>
  array(1) {
    [0]=>
    string(1) "G"
  }
}
0 голосов
/ 07 апреля 2019

Простой ответ на то, что я понимаю, вы пытаетесь сделать:

foreach($input as $nr=>$data) {
    foreach($data as $key=>$val) {
        $output[$key][$nr] = $val;
    }
}

Это просто перевернет уровни иерархии. Если вы просто хотите собрать значения, это один из способов сделать это. Он сохраняет исходные индексы массива, но вместо «[$ nr]» вы можете просто сказать «[]», чтобы сделать его простым последовательным массивом.

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

...