アレイの再構築

WBOY
リリース: 2016-06-20 12:55:14
オリジナル
2167 人が閲覧しました

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] => 浙江        ))
ログイン後にコピー


上記の 2 桁の配列の形式をタイトル名に再構築して結合したいとします。たとえば、
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] => 无锡        ))
ログイン後にコピー
ログイン後にコピー


こんにちは、モデレーターです。次のステートメントを通じてこの結果が得られました。 group_concat を使用して mysql セクションの

$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);
ログイン後にコピー
ログイン後にコピー

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!