ホームページ >バックエンド開発 >PHPチュートリアル >アレイの再構築
Array( [0] => Array ( [title] => 111 [name] => 上海 ) [1] => Array ( [title] => 111 [name] => 江苏 ) [2] => Array ( [title] => dd [name] => 上海 ) [3] => Array ( [title] => dd [name] => 江苏 ) [4] => Array ( [title] => dd [name] => 浙江 ))
array( [0]=>array( [title]=111 [name]=上海,苏州),);
$arr = array( array('title'=>'111','name'=>'上海'), array('title'=>'111','name'=>'杭州'), array('title'=>'dd','name'=>'上海'), array('title'=>'dd','name'=>'宁波'), array('title'=>'dd','name'=>'无锡'), );$title_arr = array();$data = array();foreach($arr as $value){ if(!in_array($value['title'],$title_arr)){ array_push($title_arr,$value['title']); $data[] = $value; }else{ $index = array_search($value['title'],$title_arr); $data[$index]['name'] .= ','.$value['name']; }}var_dump($data);これは非常に一般的な要件なので、次のことを思い出していただくために長い名前の一般関数
を作成しました。 MySQL (group_concat) で実行できます
function array_group_concat($ar, $field, $group_by) { $res = array(); foreach($ar as $row) { $g = $row[$group_by]; if(isset($res[$g])) $res[$g][$field] .= ',' . $row[$field]; else $res[$g] = $row; } return array_values($res);}例:
$arr = array( array('title'=>'111','name'=>'上海'), array('title'=>'111','name'=>'杭州'), array('title'=>'dd','name'=>'上海'), array('title'=>'dd','name'=>'宁波'), array('title'=>'dd','name'=>'无锡'), );print_r(array_group_concat($arr, 'name', 'title'));
Array( [0] => Array ( [title] => 111 [name] => 上海,杭州 ) [1] => Array ( [title] => dd [name] => 上海,宁波,无锡 ))名前でグループ化してタイトルを取得
$arr = array( array('title'=>'111','name'=>'上海'), array('title'=>'111','name'=>'杭州'), array('title'=>'dd','name'=>'上海'), array('title'=>'dd','name'=>'宁波'), array('title'=>'dd','name'=>'无锡'), );print_r(array_group_concat($arr, 'title', 'name'));
Array( [0] => Array ( [title] => 111,dd [name] => 上海 ) [1] => Array ( [title] => 111 [name] => 杭州 ) [2] => Array ( [title] => dd [name] => 宁波 ) [3] => Array ( [title] => dd [name] => 无锡 ))
<?php$arr = array( array('title'=>'111','name'=>'上海'), array('title'=>'111','name'=>'杭州'), array('title'=>'dd','name'=>'上海'), array('title'=>'dd','name'=>'宁波'), array('title'=>'dd','name'=>'无锡'), );$tmp = $arr[0]['title'];$newarr = array();foreach($arr as $value){ $key = $tmp == $value['title'] ? $tmp : $value['title']; $newarr[$key]['title'] = $value['title']; $newarr[$key]['name'] .= $value['name'].','; }var_dump($newarr);これは、配列のタイトルに基づいて判断することができます。
受信配列を再定義します。
元の配列をループします。
元の配列のタイトル値が同じ場合、タイトル値を新しい配列の名前値に割り当てて結合します。
異なる場合は、タイトルと名前が割り当てられます。
ループの後、新しい配列は希望の形式になります
これは非常に一般的な要件なので、思い出してもらえるように長い名前の一般関数
を作成しました。これは MySQL (group_concat) で実行できます。
function array_group_concat($ar, $field, $group_by) { $res = array(); foreach($ar as $row) { $g = $row[$group_by]; if(isset($res[$g])) $res[$g][$field] .= ',' . $row[$field]; else $res[$g] = $row; } return array_values($res);}例:
$arr = array( array('title'=>'111','name'=>'上海'), array('title'=>'111','name'=>'杭州'), array('title'=>'dd','name'=>'上海'), array('title'=>'dd','name'=>'宁波'), array('title'=>'dd','name'=>'无锡'), );print_r(array_group_concat($arr, 'name', 'title'));
Array( [0] => Array ( [title] => 111 [name] => 上海,杭州 ) [1] => Array ( [title] => dd [name] => 上海,宁波,无锡 ))名前でグループ化してタイトルを取得
$arr = array( array('title'=>'111','name'=>'上海'), array('title'=>'111','name'=>'杭州'), array('title'=>'dd','name'=>'上海'), array('title'=>'dd','name'=>'宁波'), array('title'=>'dd','name'=>'无锡'), );print_r(array_group_concat($arr, 'title', 'name'));
Array( [0] => Array ( [title] => 111,dd [name] => 上海 ) [1] => Array ( [title] => 111 [name] => 杭州 ) [2] => Array ( [title] => dd [name] => 宁波 ) [3] => Array ( [title] => dd [name] => 无锡 ))
$sql="select a.title,c.name from information_agent as a left join information_agent_area as b on a.id=b.tid left join sales_area as c on b.area_id=c.id";コマンドを変更する方法文字列の分割をより明確にするには、大文字の箇所に注目してください。
select a.title, GROUP_CONCAT(c.name) AS name from information_agent as a left join information_agent_area as b on a.id=b.tid left join sales_area as c on b.area_id=c.id GROUP BY a.title
select a.title, GROUP_CONCAT(c.name) AS name from information_agent as a left join information_agent_area as b on a.id=b.tid left join sales_area as c on b.area_id=c.id GROUP BY a.titleうーん、わかりました。ご指導ありがとうございます。実装できます。
基本查询 mysql> select * from aa;+------+------+| id| name |+------+------+|1 | 10||1 | 20||1 | 20||2 | 20||3 | 200 ||3 | 500 |+------+------+6 rows in set (0.00 sec)1.以id分组,把name字段的值打印在一行,逗号分隔(默认) mysql> select id,group_concat(name) from aa group by id;+------+--------------------+| id| group_concat(name) |+------+--------------------+|1 | 10,20,20||2 | 20 ||3 | 200,500|+------+--------------------+3 rows in set (0.00 sec)
ありがとうございます
$arr = array( array('title'=>'111','name'=>'上海'), array('title'=>'111','name'=>'杭州'), array('title'=>'dd','name'=>'上海'), array('title'=>'dd','name'=>'宁波'), array('title'=>'dd','name'=>'无锡'), );$title_arr = array();$data = array();foreach($arr as $value){ if(!in_array($value['title'],$title_arr)){ array_push($title_arr,$value['title']); $data[] = $value; }else{ $index = array_search($value['title'],$title_arr); $data[$index]['name'] .= ','.$value['name']; }}var_dump($data);これは、見て判断するのは難しくありません。配列のタイトル。
元の配列のタイトル値が同じ場合、タイトル値を新しい配列の名前値に割り当てて結合します。
異なる場合は、タイトルと名前が割り当てられます。
ループの後、新しい配列は希望の形式になります
そうですね、ご指導ありがとうございました
わかりました、ご指導ありがとうございます
<?php$arr = array( array('title'=>'111','name'=>'上海'), array('title'=>'111','name'=>'杭州'), array('title'=>'dd','name'=>'上海'), array('title'=>'dd','name'=>'宁波'), array('title'=>'dd','name'=>'无锡'), );$tmp = $arr[0]['title'];$newarr = array();foreach($arr as $value){ $key = $tmp == $value['title'] ? $tmp : $value['title']; $newarr[$key]['title'] = $value['title']; $newarr[$key]['name'] .= $value['name'].','; }var_dump($newarr);