牛骨文教育服务平台(让学习变的简单)
博文笔记

php将一个二维数组按照某个字段值合并成一维数组,如果有重复则将重复的合并成二维数组

创建时间:2013-12-18 投稿人: 浏览次数:178

关注微信公众号:wwwcoder,现在已将博客搬到这里,内容精选过后才发布出来。谢谢大家支持


最近工作中碰到一个问题,用PHP将一个二维数组按照二维数组中的各个项中的某个特定字段值合并成一维数组,如果有重复则将重复的合并成二维数组,生成的二维数组的第一维的键是特定字段的值,二维的键可以是随机索引,也可以是其中的另一个字段的值。其实这个需求经常会在工作中碰到,只是碰到的时候一个有重复的就直接用之前的覆盖后面的或者用之后的覆盖之前的,这样很容易就可以处理了。很少碰到这种有一维数组又有二维数组的情况,先上代码:

$a = array(
    0 => array("target_id" => "22", "target_type" => "1", "phone_type" => "1", "extension_number" => "15261", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
    1 => array("target_id" => "22", "target_type" => "1", "phone_type" => "2", "extension_number" => "66002", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => "1",),
    14 => array("target_id" => "22", "target_type" => "1","phone_type" => "4", "extension_number" => "56431", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
    2 => array("target_id" => "24", "target_type" => "1", "phone_type" => "1", "extension_number" => "54876", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => "1",),
    3 => array("target_id" => "25", "target_type" => "1", "phone_type" => "1", "extension_number" => "07143", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
    13 => array("target_id" => "24", "target_type" => "1", "phone_type" => "0", "extension_number" => "96949", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
    4 => array("target_id" => "26", "target_type" => "1", "phone_type" => "1", "extension_number" => "94755", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
    5 => array("target_id" => "30", "target_type" => "1", "phone_type" => "1", "extension_number" => "14171", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
    6 => array("target_id" => "36", "target_type" => "1", "phone_type" => "1", "extension_number" => "54876", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => "1",),
    7 => array("target_id" => "42", "target_type" => "1", "phone_type" => "1", "extension_number" => "31354", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
    8 => array("target_id" => "43", "target_type" => "1", "phone_type" => "1", "extension_number" => "66810", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
    9 => array("target_id" => "45", "target_type" => "1", "phone_type" => "1", "extension_number" => "34868", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
    10 => array("target_id" => "50", "target_type" => "1", "phone_type" => "1", "extension_number" => "79523", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
    11 => array("target_id" => "149", "target_type" => "1", "phone_type" => "1", "extension_number" => "59438", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
    12 => array("target_id" => "806", "target_type" => "1", "phone_type" => "1", "extension_number" => "14780", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
);
$target = array();
$temp = array();
foreach ($a as $val) {
    if (!empty($target)) {
        if (in_array($val["target_id"], array_keys($target))) {
            if (!empty($temp[$val["target_id"]])) {
                $target[$val["target_id"]] = null;
                $target[$val["target_id"]][$temp[$val["target_id"]]["phone_type"]] = $temp[$val["target_id"]];
                $temp[$val["target_id"]] = null;
            }
            $target[$val["target_id"]][$val["phone_type"]] = $val;
        } else {
            $temp[$val["target_id"]] = $val;
            $target[$val["target_id"]] = $val;
        }
    } else {
        $temp[$val["target_id"]] = $val;
        $target[$val["target_id"]] = $val;
    }
}
var_dump($target);exit;
这个返回的结果形如:

array
  22 => 
    array
      1 => 
        array
          "target_id" => string "22" (length=2)
          "target_type" => string "1" (length=1)
          "phone_type" => string "1" (length=1)
          "extension_number" => string "15261" (length=5)
          "phone_id" => string "1" (length=1)
          "phone_number" => string "4008285599" (length=10)
          "extension_special" => null
      2 => 
        array
          "target_id" => string "22" (length=2)
          "target_type" => string "1" (length=1)
          "phone_type" => string "2" (length=1)
          "extension_number" => string "66002" (length=5)
          "phone_id" => string "1" (length=1)
          "phone_number" => string "4008285599" (length=10)
          "extension_special" => string "1" (length=1)
      4 => 
        array
          "target_id" => string "22" (length=2)
          "target_type" => string "1" (length=1)
          "phone_type" => string "4" (length=1)
          "extension_number" => string "56431" (length=5)
          "phone_id" => string "1" (length=1)
          "phone_number" => string "4008285599" (length=10)
          "extension_special" => null
  24 => 
    array
      1 => 
        array
          "target_id" => string "24" (length=2)
          "target_type" => string "1" (length=1)
          "phone_type" => string "1" (length=1)
          "extension_number" => string "54876" (length=5)
          "phone_id" => string "1" (length=1)
          "phone_number" => string "4008285599" (length=10)
          "extension_special" => string "1" (length=1)
      0 => 
        array
          "target_id" => string "24" (length=2)
          "target_type" => string "1" (length=1)
          "phone_type" => string "0" (length=1)
          "extension_number" => string "96949" (length=5)
          "phone_id" => string "1" (length=1)
          "phone_number" => string "4008285599" (length=10)
          "extension_special" => null
  25 => 
    array
      "target_id" => string "25" (length=2)
      "target_type" => string "1" (length=1)
      "phone_type" => string "1" (length=1)
      "extension_number" => string "07143" (length=5)
      "phone_id" => string "1" (length=1)
      "phone_number" => string "4008285599" (length=10)
      "extension_special" => null
  26 => 
    array
      "target_id" => string "26" (length=2)
      "target_type" => string "1" (length=1)
      "phone_type" => string "1" (length=1)
      "extension_number" => string "94755" (length=5)
      "phone_id" => string "1" (length=1)
      "phone_number" => string "4008285599" (length=10)
      "extension_special" => null
  30 => 
    array
      "target_id" => string "30" (length=2)
      "target_type" => string "1" (length=1)
      "phone_type" => string "1" (length=1)
      "extension_number" => string "14171" (length=5)
      "phone_id" => string "1" (length=1)
      "phone_number" => string "4008285599" (length=10)
      "extension_special" => null
  36 => 
    array
      "target_id" => string "36" (length=2)
      "target_type" => string "1" (length=1)
      "phone_type" => string "1" (length=1)
      "extension_number" => string "54876" (length=5)
      "phone_id" => string "1" (length=1)
      "phone_number" => string "4008285599" (length=10)
      "extension_special" => string "1" (length=1)
  42 => 
    array
      "target_id" => string "42" (length=2)
      "target_type" => string "1" (length=1)
      "phone_type" => string "1" (length=1)
      "extension_number" => string "31354" (length=5)
      "phone_id" => string "1" (length=1)
      "phone_number" => string "4008285599" (length=10)
      "extension_special" => null
  43 => 
    array
      "target_id" => string "43" (length=2)
      "target_type" => string "1" (length=1)
      "phone_type" => string "1" (length=1)
      "extension_number" => string "66810" (length=5)
      "phone_id" => string "1" (length=1)
      "phone_number" => string "4008285599" (length=10)
      "extension_special" => null
  45 => 
    array
      "target_id" => string "45" (length=2)
      "target_type" => string "1" (length=1)
      "phone_type" => string "1" (length=1)
      "extension_number" => string "34868" (length=5)
      "phone_id" => string "1" (length=1)
      "phone_number" => string "4008285599" (length=10)
      "extension_special" => null
  50 => 
    array
      "target_id" => string "50" (length=2)
      "target_type" => string "1" (length=1)
      "phone_type" => string "1" (length=1)
      "extension_number" => string "79523" (length=5)
      "phone_id" => string "1" (length=1)
      "phone_number" => string "4008285599" (length=10)
      "extension_special" => null
  149 => 
    array
      "target_id" => string "149" (length=3)
      "target_type" => string "1" (length=1)
      "phone_type" => string "1" (length=1)
      "extension_number" => string "59438" (length=5)
      "phone_id" => string "1" (length=1)
      "phone_number" => string "4008285599" (length=10)
      "extension_special" => null
  806 => 
    array
      "target_id" => string "806" (length=3)
      "target_type" => string "1" (length=1)
      "phone_type" => string "1" (length=1)
      "extension_number" => string "14780" (length=5)
      "phone_id" => string "1" (length=1)
      "phone_number" => string "4008285599" (length=10)
      "extension_special" => null

如果不想要生成的二维数组的key值,或者说再精简些,可以这样:

$a = array(
    0 => array("target_id" => "22", "target_type" => "1", "phone_type" => "1", "extension_number" => "15261", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
    1 => array("target_id" => "22", "target_type" => "1", "phone_type" => "2", "extension_number" => "66002", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => "1",),
    14 => array("target_id" => "22", "target_type" => "1","phone_type" => "4", "extension_number" => "56431", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
    2 => array("target_id" => "24", "target_type" => "1", "phone_type" => "1", "extension_number" => "54876", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => "1",),
    3 => array("target_id" => "25", "target_type" => "1", "phone_type" => "1", "extension_number" => "07143", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
    13 => array("target_id" => "24", "target_type" => "1", "phone_type" => "0", "extension_number" => "96949", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
    4 => array("target_id" => "26", "target_type" => "1", "phone_type" => "1", "extension_number" => "94755", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
    5 => array("target_id" => "30", "target_type" => "1", "phone_type" => "1", "extension_number" => "14171", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
    6 => array("target_id" => "36", "target_type" => "1", "phone_type" => "1", "extension_number" => "54876", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => "1",),
    7 => array("target_id" => "42", "target_type" => "1", "phone_type" => "1", "extension_number" => "31354", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
    8 => array("target_id" => "43", "target_type" => "1", "phone_type" => "1", "extension_number" => "66810", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
    9 => array("target_id" => "45", "target_type" => "1", "phone_type" => "1", "extension_number" => "34868", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
    10 => array("target_id" => "50", "target_type" => "1", "phone_type" => "1", "extension_number" => "79523", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
    11 => array("target_id" => "149", "target_type" => "1", "phone_type" => "1", "extension_number" => "59438", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
    12 => array("target_id" => "806", "target_type" => "1", "phone_type" => "1", "extension_number" => "14780", "phone_id" => "1", "phone_number" => "4008285599", "extension_special" => NULL,),
);
$target = array();
$temp = array();
foreach ($a as $val) {
    if (!empty($target)) {
        if (in_array($val["target_id"], array_keys($target))) {
            if (!empty($temp[$val["target_id"]])) {
                $target[$val["target_id"]] = null;
                $target[$val["target_id"]][] = $temp[$val["target_id"]];
                $temp[$val["target_id"]] = null;
            }
            $target[$val["target_id"]][] = $val;
        } else {
            $temp[$val["target_id"]] = $val;
            $target[$val["target_id"]] = $val;
        }
    } else {
        $temp[$val["target_id"]] = $val;
        $target[$val["target_id"]] = $val;
    }
}
var_dump($target);exit;
生成结果如:

array
  22 => 
    array
      0 => 
        array
          "target_id" => string "22" (length=2)
          "target_type" => string "1" (length=1)
          "phone_type" => string "1" (length=1)
          "extension_number" => string "15261" (length=5)
          "phone_id" => string "1" (length=1)
          "phone_number" => string "4008285599" (length=10)
          "extension_special" => null
      1 => 
        array
          "target_id" => string "22" (length=2)
          "target_type" => string "1" (length=1)
          "phone_type" => string "2" (length=1)
          "extension_number" => string "66002" (length=5)
          "phone_id" => string "1" (length=1)
          "phone_number" => string "4008285599" (length=10)
          "extension_special" => string "1" (length=1)
      2 => 
        array
          "target_id" => string "22" (length=2)
          "target_type" => string "1" (length=1)
          "phone_type" => string "4" (length=1)
          "extension_number" => string "56431" (length=5)
          "phone_id" => string "1" (length=1)
          "phone_number" => string "4008285599" (length=10)
          "extension_special" => null
  24 => 
    array
      0 => 
        array
          "target_id" => string "24" (length=2)
          "target_type" => string "1" (length=1)
          "phone_type" => string "1" (length=1)
          "extension_number" => string "54876" (length=5)
          "phone_id" => string "1" (length=1)
          "phone_number" => string "4008285599" (length=10)
          "extension_special" => string "1" (length=1)
      1 => 
        array
          "target_id" => string "24" (length=2)
          "target_type" => string "1" (length=1)
          "phone_type" => string "0" (length=1)
          "extension_number" => string "96949" (length=5)
          "phone_id" => string "1" (length=1)
          "phone_number" => string "4008285599" (length=10)
          "extension_special" => null
  25 => 
    array
      "target_id" => string "25" (length=2)
      "target_type" => string "1" (length=1)
      "phone_type" => string "1" (length=1)
      "extension_number" => string "07143" (length=5)
      "phone_id" => string "1" (length=1)
      "phone_number" => string "4008285599" (length=10)
      "extension_special" => null
  26 => 
    array
      "target_id" => string "26" (length=2)
      "target_type" => string "1" (length=1)
      "phone_type" => string "1" (length=1)
      "extension_number" => string "94755" (length=5)
      "phone_id" => string "1" (length=1)
      "phone_number" => string "4008285599" (length=10)
      "extension_special" => null
  30 => 
    array
      "target_id" => string "30" (length=2)
      "target_type" => string "1" (length=1)
      "phone_type" => string "1" (length=1)
      "extension_number" => string "14171" (length=5)
      "phone_id" => string "1" (length=1)
      "phone_number" => string "4008285599" (length=10)
      "extension_special" => null
  36 => 
    array
      "target_id" => string "36" (length=2)
      "target_type" => string "1" (length=1)
      "phone_type" => string "1" (length=1)
      "extension_number" => string "54876" (length=5)
      "phone_id" => string "1" (length=1)
      "phone_number" => string "4008285599" (length=10)
      "extension_special" => string "1" (length=1)
  42 => 
    array
      "target_id" => string "42" (length=2)
      "target_type" => string "1" (length=1)
      "phone_type" => string "1" (length=1)
      "extension_number" => string "31354" (length=5)
      "phone_id" => string "1" (length=1)
      "phone_number" => string "4008285599" (length=10)
      "extension_special" => null
  43 => 
    array
      "target_id" => string "43" (length=2)
      "target_type" => string "1" (length=1)
      "phone_type" => string "1" (length=1)
      "extension_number" => string "66810" (length=5)
      "phone_id" => string "1" (length=1)
      "phone_number" => string "4008285599" (length=10)
      "extension_special" => null
  45 => 
    array
      "target_id" => string "45" (length=2)
      "target_type" => string "1" (length=1)
      "phone_type" => string "1" (length=1)
      "extension_number" => string "34868" (length=5)
      "phone_id" => string "1" (length=1)
      "phone_number" => string "4008285599" (length=10)
      "extension_special" => null
  50 => 
    array
      "target_id" => string "50" (length=2)
      "target_type" => string "1" (length=1)
      "phone_type" => string "1" (length=1)
      "extension_number" => string "79523" (length=5)
      "phone_id" => string "1" (length=1)
      "phone_number" => string "4008285599" (length=10)
      "extension_special" => null
  149 => 
    array
      "target_id" => string "149" (length=3)
      "target_type" => string "1" (length=1)
      "phone_type" => string "1" (length=1)
      "extension_number" => string "59438" (length=5)
      "phone_id" => string "1" (length=1)
      "phone_number" => string "4008285599" (length=10)
      "extension_special" => null
  806 => 
    array
      "target_id" => string "806" (length=3)
      "target_type" => string "1" (length=1)
      "phone_type" => string "1" (length=1)
      "extension_number" => string "14780" (length=5)
      "phone_id" => string "1" (length=1)
      "phone_number" => string "4008285599" (length=10)
      "extension_special" => null
我这样写有些复杂,但是这种需求在网上很难搜到代码,所以自己贴一份,给大家审查下,看看还有什么更简单的方法实现,毕竟我的算法学的还是挺差的。欢迎指点讨论谢谢。


















声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。