【问题标题】:Taking values from one multidimensional array and putting it in the other multidimensional array based on matching value from first key从一个多维数组中取值并根据第一个键的匹配值将其放入另一个多维数组
【发布时间】:2021-06-18 08:36:05
【问题描述】:

我有两个数组,$full_list 和 $only_titles,它们的值根据第一个键匹配。

$full_list:

Array
(
    [0] => Array
        (
            [0] => samsung-a40 
            [1] => Samsung A40 Phone
            [2] => 
            [3] => 21
            [4] => 334234
            [5] => 0          
        )

    [1] => Array
        (
            [0] => samsung-a72
            [1] => Galaxy A72 Phone
            [2] => 
            [3] => 230
            [4] => 239049
            [5] => 0    
        )
    [2] => Array
        (
            [0] => lg-k61
            [1] => LG K61 Phone 
            [2] => 
            [3] => 22
            [4] => 249582
            [5] => 0    
        )


  etc...

$only_titles:

Array
(
    [0] => Array
        (
            [0] => samsung-a40 
            [1] => Black Phone Case For Samsung A40               
        )

    [1] => Array
        (
            [0] => lg-k61
            [1] => Red Case LG K61 Phone            
        )

    [2] => Array
        (
            [0] => samsung-a72
            [1] => Folding Phone Case for Galaxy A72 Phone          
        )
   
  etc...

我想从 $only_title 数组(它的基本长产品标题)中获取第二个键的值并将其替换为 $full_list 数组:

$final_result:

Array
(
    [0] => Array
        (
            [0] => samsung-a40
            [1] => Black Phone Case For Samsung A40   // title from $only_titles
            [2] => 
            [3] => 21
            [4] => 334234
            [5] => 0          
        )

    [1] => Array
        (
            [0] => samsung-a72
            [1] => Folding Phone Case for Galaxy A72 Phone   // title from $only_titles     
            [2] => 
            [3] => 230
            [4] => 239049
            [5] => 0    
        )
    [2] => Array
        (
            [0] => lg-k61
            [1] => Red Case LG K61 Phone  // title from $only_titles
            [2] => 
            [3] => 22
            [4] => 249582
            [5] => 0    
        )
  etc...

我试过array_replace_recursive(),但问题是它期望子数组的顺序是相同的。但正如您在两个数组中看到的那样,第二个子数组不匹配。使用array_replace_recursive() 我得到第二个子数组错误:

[1] => Array
    (
        [0] => samsung-a72
        [1] => Red Case LG K61 Phone  // this is wrong
        [2] => 
        [3] => 230
        [4] => 239049
        [5] => 0    
    )

如何检查第一个键的值是否匹配?

【问题讨论】:

    标签: php multidimensional-array


    【解决方案1】:

    您可以将array_maparray_search 用于您的任务。

    $items = array_map(function($item) use ($only_titles) {
      $index = array_search($item[0], array_column($only_titles, 0));
      if($index === false) return;
    
      $item[1] = $only_titles[$index][1]; 
      return $item;
    }, $full_list);
    

    array_map() 接受$full_list 并将每个项目迭代为$item,
    然后对于每个项目,我们寻找与 array_search() 匹配的标题
    它将返回来自$only_titles 的索引。
    我们可以使用$index 来引用并将长标题分配给项目。

    结果在$items

    【讨论】:

    • 只有当两个数组($full_list 和 $only_titles)都具有匹配的键数时,此代码才有效?
    • @PeterG 是的,你是对的,如果array_search() 找不到匹配的key,它会返回false,这很容易检查。
    【解决方案2】:

    此脚本将帮助您解决问题

    <?php
    
    $full_array = [
        [
            'samsung-a40',
            'Samsung A40 Phone',
            null,
            21,
            334234,
            0,
        ],
        [
            'samsung-a72',
            'Galaxy A72 Phone',
            null,
            230,
            239049,
            0,
        ],
    ];
    
    $only_titles = [
        [
            'samsung-a40',
            'Black Phone Case For Samsung A40',
        ],
        [
            'samsung-a72',
            'Red Case LG K61 Phone  ',
        ],
    ];
    
    $formattedOnlyTitles = [];
    foreach ($only_titles as $value) {
        $formattedOnlyTitles[$value[0]] = $value[1];
    }
    
    $fullArrayWithNewTitle = [];
    foreach ($full_array as $value) {
        if (isset($formattedOnlyTitles[$value[0]])) {
            $value[1] = $formattedOnlyTitles[$value[0]];
        }
    
        $fullArrayWithNewTitle[] = $value;
    }
    
    print_r($fullArrayWithNewTitle);
    

    输出

    Array
    (
        [0] => Array
            (
                [0] => samsung-a40
                [1] => Samsung A40 Phone
                [2] => 
                [3] => 21
                [4] => 334234
                [5] => 0
            )
    
        [1] => Array
            (
                [0] => samsung-a72
                [1] => Galaxy A72 Phone
                [2] => 
                [3] => 230
                [4] => 239049
                [5] => 0
            )
    )
    

    首先我更改了title_only var 的格式,以使其在下一个 foreach 中易于使用

    $formattedOnlyTitles = [];
    foreach ($only_titles as $value) {
        $formattedOnlyTitles[$value[0]] = $value[1];
    }
    

    在下一个 foreach 中,我只是用我的新格式化 title_only 数组检查标题

    if (isset($formattedOnlyTitles[$value[0]])) {
        $value[1] = $formattedOnlyTitles[$value[0]];
    }
    

    如果我需要,然后更改标题

    【讨论】:

    • 如果 $only_titles 数组小于 $full_array 怎么办。将是在 foreach 中使用 else 语句和 unset($value) 的最佳方式。然后在 foreach 之外使用 array_filter($fullArrayWithNewTitle) 和 array_values($fullArrayWithNewTitle) 来清理间隙还是有更简单的方法?
    • 您可以按照您认为更好的方式实施,但恕我直言,我的脚本现在很简单,还可以,也很容易理解
    猜你喜欢
    • 2020-05-29
    • 2023-04-03
    • 2012-10-18
    • 1970-01-01
    • 2011-07-09
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多