【问题标题】:array_merge multidimensional arraysarray_merge 多维数组
【发布时间】:2013-11-06 14:40:53
【问题描述】:

我有 2 个数组 - 一个是硬编码的,另一个是从数据库中检索的数据。 我正在尝试合并它们,但我得到了意想不到的结果。

这是第一个数组的打印结果:

Array
(
    [0] => Array
    (
        [product_image_one] => 
    )

    [1] => Array
    (
        [product_image_two] => 
    )

    [2] => Array
    (
        [product_image_three] => 
    )

    [3] => Array
    (
        [product_image_four] => 
    )
)

这是第二个数组的打印结果:

Array
(
    [0] => Array
    (
        [product_image_one] => ../wp-content/themes/dosco/images/products_images/355_product_image_one.jpg
    )
)

但是,当我尝试像这样合并它们时:

$new_array = array_merge($base_image_array, $db_product_images);

结果是这样的:

Array
(
    [0] => Array
    (
        [product_image_one] => 
    )

    [1] => Array
    (
        [product_image_two] => 
    )

    [2] => Array
    (
        [product_image_three] => 
    )

    [3] => Array
    (
        [product_image_four] => 
    )

    [4] => Array
    (
        [product_image_one] => ../wp-content/themes/dosco/images/products_images/355_product_image_one.jpg
    )

)

我想要实现的是:

Array
(
    [0] => Array
    (
        [product_image_one] => ../wp-content/themes/dosco/images/products_images/355_product_image_one.jpg
    )

    [1] => Array
    (
        [product_image_two] => 
    )

    [2] => Array
    (
        [product_image_three] => 
    )

    [3] => Array
    (
        [product_image_four] => 
    )

)

我认为数组的多维特性让我感到困惑。

【问题讨论】:

  • 如果键在数组中重复,是否要覆盖之前的值?

标签: php multidimensional-array array-merge


【解决方案1】:

将你的 num 索引数组清理为 kv 数组

<?php

$base_image_array = array
(
 array("product_image_one" => ""),
 array("product_image_two" => ""),
 array("product_image_three" => ""),
 array("product_image_four" => "")
);

$db_product_images = array
(
 array("product_image_one" => "../wp-content/themes/dosco/images/products_images/355_product_image_one.jpg"),
);

function kv($a){
    $keys = array_map(current, array_map(array_keys, $a));
    $values = array_map(current, array_map(array_values, $a));

    return array_combine($keys, $values);
}

$base_image_array  = kv($base_image_array);
$db_product_images = kv($db_product_images);

$new_array = array_merge($base_image_array, $db_product_images);
print_r($new_array);

输出

Array
(
    [product_image_one] => ../wp-content/themes/dosco/images/products_images/355_product_image_one.jpg
    [product_image_two] =>
    [product_image_three] =>
    [product_image_four] =>
)

【讨论】:

    【解决方案2】:

    问题是两个数组中的数组键都是数字的。如果您希望一个数组覆盖另一个数组,则需要使它们进入数组键为字符串的状态。你可以这样做:

    $array_with_four = array(...); // The large array
    $new_array_with_four = format_arrays($array_with_four);
    
    $array_with_one = array(...); // The small array
    $new_array_with_one = format_arrays($array_with_one);
    
    $merged = array_merge($new_array_with_four, $new_array_with_one); // Your new results
    
    function format_arrays($array) {
        $return_array = array(); // Blank array
        foreach ($array as $child_key => $child_data){
            $return_array[$child_key] = $child_data;
        }
        return $return_array;
    }
    

    可能有更好的方法来循环使用 php 数组函数 - 但这应该可以完成工作!

    【讨论】:

      【解决方案3】:

      解决方案与@Matthew R 的答案非常相似。

      /* Base Array */
      $base_image_array = array(
          array('product_image_one' => ''),
          array('product_image_two' => ''),
          array('product_image_three' => ''),
          array('product_image_four' => '')
      );
      
      /* Populated Array */
      $db_product_images = array(
          array("product_image_one" => "../wp-content/themes/dosco/images/products_images/355_product_image_one.jpg")
      );
      
      function format_array($array) {
          $return_array = array();
          foreach ($array as $key => $value) {
              foreach ($value as $k => $v) {
                  $return_array[$k] = $v;
              }
          }
          return $return_array;
      }
      
      $array1 = format_array($base_image_array);
      $array2 = format_array($db_product_images);
      
      $final_array = array_merge($array1, $array2);
      
      echo '<pre>';
          print_r($final_array);
      echo '</pre>';
      

      结果输出是这样的:

      Array
      (
          [product_image_one] => ../wp-content/themes/dosco/images/products_images/355_product_image_one.jpg
          [product_image_two] => 
          [product_image_three] => 
          [product_image_four] => 
      )
      

      最终的输出实际上与我最初认为我需要的不同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多