Слияние массивов из цикла foreach в PHP

Я делаю веб-сайт, который использует цикл foreach для вывода. На выходе получается куча массивов, но это не совсем правильно. Я использовал foreach дважды, потому что для вывода требуется 2 массива. У меня есть нужные мне массивы, но я не могу их объединить. Мне нужно, чтобы они были объединены, потому что я хочу отсортировать массив на основе значения.

Это код, который я использую:

$counter_saw_wp = 0;
foreach($v as $key => $value){
    foreach($v_wp as $k => $val){
        $v_saw_wp[$k]["phone_id"] = $val["phone_id"];
        $v_saw_wp[$k]["phone_name"] = $val["phone_name"];
        $v_saw_wp[$k]["phone_ram"] = $val["phone_ram"];
        $v_saw_wp[$k]["phone_memory"] = $val["phone_memory"];
        $v_saw_wp[$k]["phone_img"] = $val["phone_img"];
        $v_saw_wp[$k]["v_saw"] = $value ["v"];
        $v_saw_wp[$k]["v_wp"] = $val["v_wp"];
        $v_saw_wp[$k]["v_saw_wp"] = (($value["v"] + $val["v_wp"])/2);
    }

    $v_total_saw_wp = array();
    $v_total_saw_wp[] = array_merge($v_total_saw_wp, $v_saw_wp[$counter_saw_wp]);

    $counter_saw_wp++;
    
    var_dump($v_total_saw_wp); 
}

И это результат, когда я var_dump переменную:

array(1) {
  [0]=>
  array(8) {
    ["phone_id"]=>
    string(2) "26"
    ["phone_name"]=>
    string(19) "Samsung Galaxy S23+"
    ["phone_ram"]=>
    string(1) "8"
    ["phone_memory"]=>
    string(3) "256"
    ["phone_img"]=>
    string(11) "s23plus.png"
    ["v_saw"]=>
    float(45)
    ["v_wp"]=>
    float(2.7588120104614227)
    ["v_saw_wp"]=>
    float(23.879406005230713)
  }
}
array(1) {
  [0]=>
  array(8) {
    ["phone_id"]=>
    string(2) "27"
    ["phone_name"]=>
    string(24) "Samsung Galaxy S23 Ultra"
    ["phone_ram"]=>
    string(2) "12"
    ["phone_memory"]=>
    string(3) "256"
    ["phone_img"]=>
    string(12) "s23ultra.png"
    ["v_saw"]=>
    float(41.25)
    ["v_wp"]=>
    float(2.5434238896587567)
    ["v_saw_wp"]=>
    float(21.896711944829377)
  }
}
array(1) {
  [0]=>
  array(8) {
    ["phone_id"]=>
    string(2) "28"
    ["phone_name"]=>
    string(24) "Samsung Galaxy S23 Ultra"
    ["phone_ram"]=>
    string(2) "12"
    ["phone_memory"]=>
    string(3) "512"
    ["phone_img"]=>
    string(12) "s23ultra.png"
    ["v_saw"]=>
    int(40)
    ["v_wp"]=>
    float(2.475319476936885)
    ["v_saw_wp"]=>
    float(21.23765973846844)
  }
}

Но если я использую $v_total_saw_wp = $v_saw_wp[$counter_saw_wp]; вместо

$v_total_saw_wp = array();
$v_total_saw_wp[] = array_merge($v_total_saw_wp, $v_saw_wp[$counter_saw_wp]);

Это результат, который я получаю:

array(8) {
  ["phone_id"]=>
  string(2) "26"
  ["phone_name"]=>
  string(19) "Samsung Galaxy S23+"
  ["phone_ram"]=>
  string(1) "8"
  ["phone_memory"]=>
  string(3) "256"
  ["phone_img"]=>
  string(11) "s23plus.png"
  ["v_saw"]=>
  float(45)
  ["v_wp"]=>
  float(2.7588120104614227)
  ["v_saw_wp"]=>
  float(23.879406005230713)
}
array(8) {
  ["phone_id"]=>
  string(2) "27"
  ["phone_name"]=>
  string(24) "Samsung Galaxy S23 Ultra"
  ["phone_ram"]=>
  string(2) "12"
  ["phone_memory"]=>
  string(3) "256"
  ["phone_img"]=>
  string(12) "s23ultra.png"
  ["v_saw"]=>
  float(41.25)
  ["v_wp"]=>
  float(2.5434238896587567)
  ["v_saw_wp"]=>
  float(21.896711944829377)
}
array(8) {
  ["phone_id"]=>
  string(2) "28"
  ["phone_name"]=>
  string(24) "Samsung Galaxy S23 Ultra"
  ["phone_ram"]=>
  string(2) "12"
  ["phone_memory"]=>
  string(3) "512"
  ["phone_img"]=>
  string(12) "s23ultra.png"
  ["v_saw"]=>
  int(40)
  ["v_wp"]=>
  float(2.475319476936885)
  ["v_saw_wp"]=>
  float(21.23765973846844)
}

Но это должно выглядеть так: (чтобы я мог его отсортировать)

array(3) {  
  [0]=>
  array(8) {
    ["phone_id"]=>
    string(2) "26"
    ["phone_name"]=>
    string(19) "Samsung Galaxy S23+"
    ["phone_ram"]=>
    string(1) "8"
    ["phone_memory"]=>
    string(3) "256"
    ["phone_img"]=>
    string(11) "s23plus.png"
    ["v_saw"]=>
    float(45)
    ["v_wp"]=>
    float(2.7588120104614227)
    ["v_saw_wp"]=>
    float(23.879406005230713)
  }
  [1]=>
  array(8) {
    ["phone_id"]=>
    string(2) "27"
    ["phone_name"]=>
    string(24) "Samsung Galaxy S23 Ultra"
    ["phone_ram"]=>
    string(2) "12"
    ["phone_memory"]=>
    string(3) "256"
    ["phone_img"]=>
    string(12) "s23ultra.png"
    ["v_saw"]=>
    float(41.25)
    ["v_wp"]=>
    float(2.5434238896587567)
    ["v_saw_wp"]=>
    float(21.896711944829377)
  }
  [2]=>
  array(8) {
    ["phone_id"]=>
    string(2) "28"
    ["phone_name"]=>
    string(24) "Samsung Galaxy S23 Ultra"
    ["phone_ram"]=>
    string(2) "12"
    ["phone_memory"]=>
    string(3) "512"
    ["phone_img"]=>
    string(12) "s23ultra.png"
    ["v_saw"]=>
    int(40)
    ["v_wp"]=>
    float(2.475319476936885)
    ["v_saw_wp"]=>
    float(21.23765973846844)
  }
}

Я пытался использовать array_merge в цикле foreach, но это не сработало. Он просто помещает каждый массив в другой массив (как показано выше). Я также пытался использовать array_merge вне цикла foreach, но он просто берет последний массив из цикла.

[РЕДАКТИРОВАТЬ] Я пробовал использовать этот код (ответ Сергея Леоненко):

$counter_saw_wp = 0;
$v_total_saw_wp = array();
foreach($v as $key => $value){
    foreach($v_wp as $k => $val){
        $v_saw_wp[$k]["phone_id"] = $val["phone_id"];
        $v_saw_wp[$k]["phone_name"] = $val["phone_name"];
        $v_saw_wp[$k]["phone_ram"] = $val["phone_ram"];
        $v_saw_wp[$k]["phone_memory"] = $val["phone_memory"];
        $v_saw_wp[$k]["phone_img"] = $val["phone_img"];
        $v_saw_wp[$k]["v_saw"] = $value ["v"];
        $v_saw_wp[$k]["v_wp"] = $val["v_wp"];
        $v_saw_wp[$k]["v_saw_wp"] = (($value["v"] + $val["v_wp"])/2);
    }

    $v_total_saw_wp[] = array_merge($v_total_saw_wp, $v_saw_wp[$counter_saw_wp]);

    $counter_saw_wp++;
    
    var_dump($v_total_saw_wp); 
}

Но когда я var_dump переменную, вывод выглядит так:

array(3) 
    { 
        [0]=> array(8) 
            { 
                ["phone_id"]=> string(2) "26" 
                ["phone_name"]=> string(19) "Samsung Galaxy S23+" 
                ["phone_ram"]=> string(1) "8" 
                ["phone_memory"]=> string(3) "256" 
                ["phone_img"]=> string(11) "s23plus.png" 
                ["v_saw"]=> float(45) 
                ["v_wp"]=> float(2.7588120104614227) 
                ["v_saw_wp"]=> float(23.879406005230713) 
            } 
        [1]=> array(9) 
            { 
                [0]=> array(8) 
                    { 
                        ["phone_id"]=> string(2) "26" 
                        ["phone_name"]=> string(19) "Samsung Galaxy S23+" 
                        ["phone_ram"]=> string(1) "8" 
                        ["phone_memory"]=> string(3) "256" 
                        ["phone_img"]=> string(11) "s23plus.png" 
                        ["v_saw"]=> float(45) 
                        ["v_wp"]=> float(2.7588120104614227) 
                        ["v_saw_wp"]=> float(23.879406005230713) 
                    } 
                ["phone_id"]=> string(2) "27" 
                ["phone_name"]=> string(24) "Samsung Galaxy S23 Ultra" 
                ["phone_ram"]=> string(2) "12" 
                ["phone_memory"]=> string(3) "256" 
                ["phone_img"]=> string(12) "s23ultra.png" 
                ["v_saw"]=> float(41.25) 
                ["v_wp"]=> float(2.5434238896587567) 
                ["v_saw_wp"]=> float(21.896711944829377) 
            } 
        [2]=> array(10) 
            { 
                [0]=> array(8) 
                    { 
                        ["phone_id"]=> string(2) "26" 
                        ["phone_name"]=> string(19) "Samsung Galaxy S23+" 
                        ["phone_ram"]=> string(1) "8" 
                        ["phone_memory"]=> string(3) "256" 
                        ["phone_img"]=> string(11) "s23plus.png" 
                        ["v_saw"]=> float(45) 
                        ["v_wp"]=> float(2.7588120104614227) 
                        ["v_saw_wp"]=> float(23.879406005230713) 
                    } 
                [1]=> array(9) 
                    { 
                        [0]=> array(8) 
                            { 
                                ["phone_id"]=> string(2) "26" 
                                ["phone_name"]=> string(19) "Samsung Galaxy S23+" 
                                ["phone_ram"]=> string(1) "8" 
                                ["phone_memory"]=> string(3) "256" 
                                ["phone_img"]=> string(11) "s23plus.png" 
                                ["v_saw"]=> float(45) 
                                ["v_wp"]=> float(2.7588120104614227) 
                                ["v_saw_wp"]=> float(23.879406005230713) 
                            } 
                        ["phone_id"]=> string(2) "27" 
                        ["phone_name"]=> string(24) "Samsung Galaxy S23 Ultra" 
                        ["phone_ram"]=> string(2) "12" 
                        ["phone_memory"]=> string(3) "256" 
                        ["phone_img"]=> string(12) "s23ultra.png" 
                        ["v_saw"]=> float(41.25) ["v_wp"]=> float(2.5434238896587567) 
                        ["v_saw_wp"]=> float(21.896711944829377) 
                    } 
                ["phone_id"]=> string(2) "28" 
                ["phone_name"]=> string(24) "Samsung Galaxy S23 Ultra" 
                ["phone_ram"]=> string(2) "12" 
                ["phone_memory"]=> string(3) "512" 
                ["phone_img"]=> string(12) "s23ultra.png" 
                ["v_saw"]=> int(40) 
                ["v_wp"]=> float(2.475319476936885) 
                ["v_saw_wp"]=> float(21.23765973846844) 
            } 
    }

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

Кто-нибудь знает, как это исправить?

[ДРУГОЕ РЕДАКТИРОВАНИЕ] Я решил это! Это код, который я использую:


        $counter_saw_wp = 0;
        foreach($v as $key => $value){
            foreach($v_wp as $k => $val){
                $v_saw_wp[$k]["phone_id"] = $val["phone_id"];
                $v_saw_wp[$k]["phone_name"] = $val["phone_name"];
                $v_saw_wp[$k]["phone_ram"] = $val["phone_ram"];
                $v_saw_wp[$k]["phone_memory"] = $val["phone_memory"];
                $v_saw_wp[$k]["phone_img"] = $val["phone_img"];
                $v_saw_wp[$k]["v_saw"] = $value ["v"];
                $v_saw_wp[$k]["v_wp"] = $val["v_wp"];
                $v_saw_wp[$k]["v_saw_wp"] = (($value["v"] + $val["v_wp"])/2);
            }

            $v_avg_saw_wp[] = array_merge(array(), $v_saw_wp[$counter_saw_wp]);

            $counter_saw_wp++;
        }
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша ошибка заключалась в том, что вы определяете и присваиваете массив массиву. Но вы должны определить свой массив вне цикла foreach:

$v_total_saw_wp = [];
foreach($v as $key => $value){
    foreach($v_wp as $k => $val){
       $v_total_saw_wp[$key]["phone_id"] = $val["phone_id"];
       $v_total_saw_wp[$key]["phone_name"] = $val["phone_name"];
       $v_total_saw_wp[$key]["phone_ram"] = $val["phone_ram"];
       $v_total_saw_wp[$key]["phone_memory"] = $val["phone_memory"];
       $v_total_saw_wp[$key]["phone_img"] = $val["phone_img"];
       $v_total_saw_wp[$key]["v_saw"] = $value ["v"];
       $v_total_saw_wp[$key]["v_wp"] = $val["v_wp"];
       $v_total_saw_wp[$key]["v_saw_wp"] = (($value["v"] + $val["v_wp"])/2);
    }
}

Это должно заставить это работать и дать вам желаемый результат.

Я пробовал, но вывод по-прежнему неправильный. Я отредактировал свой пост с выводом, когда попытался определить массив вне цикла foreach.

Thea 01.04.2023 23:29

@Thea Вам не нужно использовать array_merge, просто назначьте непосредственно указанному $key

Serghei Leonenco 01.04.2023 23:48

Другие вопросы по теме