【问题标题】:Compare 2 sets of array against similar key将 2 组数组与相似键进行比较
【发布时间】:2018-06-21 15:04:59
【问题描述】:

我正在尝试将 2 组数组与相同的键 product_sku 进行比较

API 上的数组(JSON 响应)

$array1 = array (
    "products" => array(
        "category" => array(
            array(
                "product_sku" => "1",
                "product_type" => "Type",
                "customer_contact_name" => "Contact Name",
                "customer_telephone" => "0000 000 000",
                "customer_email" => "email@email.com",
                "customer_postcode" => "PostCode",
                "additional_info" => array(
                    "some information" => "some information"
                ),
                "full_price" => "50.00",
                "product_name" => "Product Name",
                "product_id" => "1",
                "customer_rating" => "0"
            ),
            array(
                "product_sku" => "2",
                "product_type" => "Type",
                "customer_contact_name" => "Contact Name",
                "customer_telephone" => "0000 000 000",
                "customer_email" => "email@email.com",
                "customer_postcode" => "PostCode",
                "additional_info" => array(
                    "some information" => "some information"
                ),
                "full_price" => "100.00",
                "product_name" => "Product Name",
                "product_id" => "2",
                "customer_rating" => "0"
            )
        )
    )
);

本地数据库上的数组(mysqli 查询)

$array2 = array (
    array(
        "product_sku" => "1",
        "product_type" => "Type",
        "contact_name" => "Contact Name",
        "phone" => "0000 000 000",
        "full_price" => "0.00",
        "product_name" => "Product Name",
        "product_id" => "1",
        "rating" => "0"
    ),
    array(
        "product_sku" => "3",
        "product_type" => "Type",
        "contact_name" => "Contact Name",
        "phone" => "0000 000 000",
        "full_price" => "80.00",
        "product_name" => "Product Name",
        "product_id" => "3",
        "rating" => "0"
    )
);

目标是

  1. 检查$array2$array1 并且仅当product_sku 匹配(存在于$array1 中),从$array1 获取full_price 并替换$array2 中的full_price

  2. 如果$array1 中的product_id$array2 中不存在,则忽略这些产品。

  3. 使用sort函数对产品价格进行排序(从低到高)

我尝试的是,部分工作但无法使用 sort 函数对产品价格进行排序(从低到高),它显示某些产品的 0.00 full_price 价值

$apiarray = $array1["products"]["category"];

foreach ($array2 as $arr2) {
    foreach ($apiarray as $arr1) {
        if ($arr1['product_sku']==$arr2['product_sku']) {
            echo $arr2['product_sku']; // Product from $array2
            echo number_format($arr1['full_price'],2); // Price from $array1
        } else {
            echo $arr2['product_sku']; // Product from $array2
            echo number_format($arr2['full_price'],2); // Price from $array2
        }
    }
)

我需要帮助来确定我们的目标或为我指明正确的方向如何实现目标

【问题讨论】:

  • 它显示某些产品的 0.00 full_price 值 那是因为您甚至没有尝试修改 $array2 中的价格 回声的东西不会改变任何东西
  • 我也没有看到任何对任何东西进行排序的尝试。 我们非常愿意帮助您修复您的代码,但我们不会为您编写代码
  • @RiggsFolly 我之前在$array2 上使用过sort($array),其中full_price 是第一个元素,因此它会自动将价格从低到高排序,并且如果我能够的话,我计划使用相同的方法解决上述问题,我认为比较两个数组中的full_price 足以让我得到想要的结果,如果我知道如何修改$array2 的价格,我不会在这里问问题。不要为我写代码,但至少有礼貌地指出正确的方向
  • 请随时寻求有关编码问题的帮助,但我们的想法是您尝试编写代码,我们会尝试帮助您修复它。您提供了一个规范和很少的您自己的代码,以表明您已尝试编写代码以满足该要求。所以这看起来像是一个为我做的问题。 meta.stackoverflow.com/questions/260648/…

标签: php arrays sorting mysqli


【解决方案1】:

你可以这样做:

//Make a temp associative array. This will make the product_sku as the key
//This is to make it easier to check if product_sku exist
$arrayTemp1 = array_column($array1['products']['category'], null, 'product_sku');

//Loop thru the array2.
//Check if the key exist on temp array. If it does, update the price
foreach( $array2 as &$value ) {
    if ( isset( $arrayTemp1[ $value['product_sku'] ] ) ) 
        $value['full_price'] = $arrayTemp1[ $value['product_sku'] ]['full_price'];
}

//Sort the $array2 using usort
usort( $array2, function($a, $b){
    return $a['full_price'] - $b['full_price'];
});

echo "<pre>";
print_r( $array2 );
echo "</pre>";

这将导致:

Array
(
    [0] => Array
        (
            [product_sku] => 1
            [product_type] => Type
            [contact_name] => Contact Name
            [phone] => 0000 000 000
            [full_price] => 50.00
            [product_name] => Product Name
            [product_id] => 1
            [rating] => 0
        )

    [1] => Array
        (
            [product_sku] => 3
            [product_type] => Type
            [contact_name] => Contact Name
            [phone] => 0000 000 000
            [full_price] => 80.00
            [product_name] => Product Name
            [product_id] => 3
            [rating] => 0
        )

)

【讨论】:

  • 回答Help Vampires 只会鼓励他们和其他人让其他人完成所有工作
  • 感谢您的帮助和解释,我不知道答案中解释的 Check if the key exist on temp array 方法,是依靠 php.net/manual/en/ref.array.php 来做腿部工作,但当然,每一个障碍我们都会学到一些东西新的,再次感谢。
【解决方案2】:

您不是在编辑$array2,而只是在循环中打印。您的第二步不是必需的,它来自您的嵌套 foreach


首先,您可以获得 SKU 列表:
$sku_list = array_column($array1['products']['category'], 'product_sku');

然后更新价格:

// Loop through the 2nd array
for ($i = 0; $i < count($array2); $i += 1) {
    if (in_array($array2[$i]['product_sku'], $sku_list)) {

        // Get the index of the 1st array item which SKU is matching, and update
        $index = array_search($array2[$i]['product_sku'], $sku_list);
        $array2[$i]['full_price'] = $array1['products']['category'][$index]['full_price'];
    }
}

然后使用usort() 和 PHP7 的spaceship operator 进行排序(如果在较低的 PHP 版本中易于替换):

usort($array2, function($a, $b) { return $a['full_price'] <=> $b['full_price']; });

【讨论】:

  • @Shehary 我希望它有所帮助。反正做起来很有趣
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 2017-12-22
  • 2012-07-06
相关资源
最近更新 更多