Сравнить два массива по ключу и создать несколько значений набора массивов, если ключ не соответствует

У меня есть два нескольких массива с данными ключ => значение в них. Например, вот так:

$k_a = array( array(
        "article" =>  "c",
        "price"   =>  2
    ), array(
        "article" =>  "f",
        "price"   =>  3
    )
); 

$k_b = array( array(
        "article" =>  "a",
        "price"   =>  2
    ), array(
        "article" =>  "b",
        "price"   =>  4
    ), array(
        "article" =>  "c",
        "price"   =>  1
    ), array(
        "article" =>  "g",
        "price"   =>  3
    )
);

У меня есть массив со всеми статьями, но цена установлена ​​на ноль.

$a_f = array( array(
        "article"=> "a", 
        "price"  => 0,
    ), array(
        "article"=> "b", 
        "price"  => 0,
    ), array(
        "article"=> "c", 
        "price"  => 0,
    ), array(
        "article"=> "d", 
        "price"  => 0,
    ), array(
        "article"=> "e", 
        "price"  => 0,
    ), array(
        "article"=> "f", 
        "price"  => 0,
    ), array(
        "article"=> "g", 
        "price"  => 0,
    ), array(
        "article"=> "h", 
        "price"  => 0,
    )
);

Теперь я хочу проверить, существуют ли значения ключей article в $ k_a и $ k_b в $ a_f, и создать новый массив со значениями ключевой цены для этой статьи. Другой товар должен иметь нулевую цену. В и я хочу сравнить два новых массива и удалить ключевые статьи, где цена равна нулю.

У и массивы должны быть такими:

$k_a_new =array( array(
        "article" => "a",
        "price"   => 0
    ), array(
        "article" => "b",
        "price"   => 0
    ), array(
        "article" => "c",
        "price"   => 2
    ), array(
        "article" => "f",
        "price"   => 3
    ), array(
        "article" => "g",
        "price"   => 0
    )          
);

$k_b_new = array( array(
        "article" => "a",
        "price"   => 2
    ), array(
        "article" => "b",
        "price"   => 4
    ), array(
        "article" => "c",
        "price"   => 1
    ), array(
        "article" => "f",
        "price"   => 0
    ), array(
        "article" => "g",
        "price"   => 3
    )            
);

В результирующем массиве должны содержаться все статьи обоих массивов, кроме самой статьи, если она существует. Есть ли функции или конкретный способ решить эту проблему?

Я пытался перебрать массивы и показать те же значения статей, но не знаю, как изменить значения цен или добавить статьи с нулевой ценой?

echo "<br>";
foreach($k_b as $key_1=>$value_1){
    foreach($value_1 as $k_11=>$v_11){
        if ($k_11 == "article"){
            foreach($a_f as $key_2=>$value_2){
                foreach($value_2 as $k_21=>$v_21){
                    if ($k_21 === "article"){
                        if ($v_11 === $v_21){
                            print_r($v_21);
                            echo "<br>";
                        }
                    }
                }
            }
        }
    }
}

«не очень эффективно» ничего конкретного не говорит о вашей проблеме. Пожалуйста, покажите свой текущий код и объясните, что он выводит в данный момент. Мы не можем исправить то, чего не видим. Спасибо

ADyson 19.10.2018 13:26

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

Anant Kumar Singh 19.10.2018 13:30

@ADyson My Code ничего не делает ... просто перебирайте массивы, так что нет необходимости показывать ...

Alex 19.10.2018 13:47

@AlivetoDie Можете ли вы показать мне пример, как?

Alex 19.10.2018 13:47

Значит, вы говорите, что еще ничего не пробовали? Существует множество функций PHP, которые имеют дело с массивами, сопоставлением ключей, проверкой наличия ключей и значений и т. д. Искать в Интернете легко. По крайней мере, вы должны были действительно предпринять некоторые попытки, прежде чем просить других решить для вас сложную задачу в их свободное время.

ADyson 19.10.2018 13:48

@Alex, вы должны показать некоторые усилия по коду, что вы пробовали до сих пор

Anant Kumar Singh 19.10.2018 13:50

@ADyson, это мой код цикла, но я не знаю, как продолжить или изменить и добавить vaules

Alex 19.10.2018 13:55

Это означает, что вы на самом деле не проводили никаких исследований, потому что об изменении и добавлении значений в массивы нетрудно узнать. Если вы спрашиваете о логике, с помощью которой вы это делаете, это означает, что вам нужно сесть, обдумать процесс на бумаге и придумать алгоритм (то есть логический процесс для выполнения задачи, который можно автоматизировать с помощью компьютер). Затем попробуйте реализовать алгоритм. Если вы застряли с попыткой реализация, вернитесь к своей попытке, и мы можем помочь вам в дальнейшем с аспектами, специфичными для PHP (если Google вам еще не помог).

ADyson 19.10.2018 14:14

@Alex: Я попытался понять логику вашего вопроса, и, как я объяснил, это не имеет для меня смысла. Бывший. вы начинаете с k_a, k_b и a_f. Тогда вам нужны два новых массива. №1 вы говорите если значения ключей article в $ k_a и $ k_b существуют в $ a_f и создать новый массив со значениями ключевой цены для этой статьи. Для меня это означает a: 0, b: 0, c: 2 или 1, f: 0, g: 0. Из выходных данных образца вы берете наивысшее значение для c. Тем не менее, вы получаете a: 0:, b: 0, c: 2, f: 3, g: 0. почему f: 3? Его нет в к_б. Сначала объясните свою логику.

Nic3500 19.10.2018 14:19
Стоит ли изучать 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 и хотите разрабатывать...
1
9
98
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Делать это нужно так: -

<?php

$k_a = array( array(
        "article" =>  "c",
        "price"   =>  2
    ), array(
        "article" =>  "f",
        "price"   =>  3
    )
); 

$k_b = array( array(
        "article" =>  "a",
        "price"   =>  2
    ), array(
        "article" =>  "b",
        "price"   =>  4
    ), array(
        "article" =>  "c",
        "price"   =>  1
    ), array(
        "article" =>  "g",
        "price"   =>  3
    )
);

$final_article_array = array_values(array_unique(array_merge(array_column($k_a,'article'),array_column($k_b,'article'))));
sort($final_article_array);

$k_a_new = [];
$k_b_new = [];
foreach($final_article_array as $key=>$final_article_arr){
    $k = array_search($final_article_arr,array_column($k_a,'article'));
    if ($k !==false){
        $k_a_new[$final_article_arr]['article'] = $final_article_arr;
        $k_a_new[$final_article_arr]['price'] = $k_a[$k]['price'];
    }else{
        $k_a_new[$final_article_arr]['article'] = $final_article_arr;
        $k_a_new[$final_article_arr]['price'] = 0;
    }
    $j = array_search($final_article_arr,array_column($k_b,'article'));
    if ($j !==false){
        $k_b_new[$final_article_arr]['article'] = $final_article_arr;
        $k_b_new[$final_article_arr]['price'] = $k_b[$j]['price'];
    }else{
        $k_b_new[$final_article_arr]['article'] = $final_article_arr;
        $k_b_new[$final_article_arr]['price'] = 0;
    }
}
$k_a_new = array_values($k_a_new);
$k_b_new = array_values($k_b_new);

print_r($k_a_new);
print_r($k_b_new);

Выход: -https://3v4l.org/DTiJk

Примечание: - объяснение

1) попробуйте получить все значения статей из $k_a и $k_b, объединить их, чтобы получить всю статью в один массив, удалить дубликаты из этого массива, а затем повторно проиндексировать этот массив. Теперь отсортируйте этот массив статей по значению.

2) Выполните итерации и проверьте, присутствует ли статья в массивах $ k_a и $ k_b или нет (используя array_search)

3) Теперь вы получаете индекс дочернего массива через array_search(), если статья найдена.

4) На основе этого ключа получите значение цены дочернего массива и добавьте его в свой окончательный массив с соответствующей статьей.

5) Если индекса нет, поместите цену 0 для соответствующей статьи в окончательный массив.

Получите все функции Php здесь

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

Nic3500 19.10.2018 14:20

@Alive to Die спасибо, я не знал, что есть такие функции, как array_column () или array_search () для массивов значений ключей

Alex 19.10.2018 14:30

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