在 php 或 angular 中处理关联数组
Handling associative array either in php or angular
我的 PHP 代码得到以下数组结果。
$aa = {
"1": [
{
"ID": "1",
"IDu": "1",
"doc_picture": "yes",
"doc_contract": "no",
"doc_name": "images201103928128.jpg"
},
{
"ID": "1",
"IDu": "1",
"doc_picture": "no",
"doc_contract": "yes",
"doc_name": "images20110_doc.jpg"
},
{
"ID": "1",
"IDu": "1",
"doc_picture": "yes",
"doc_contract": "no",
"doc_name": "28128.jpg"
},
{
"ID": "1",
"IDu": "1",
"doc_picture": "yes",
"doc_contract": "no",
"doc_name": "i128.jpg"
}
],
"2": [
{
"ID": "2",
"IDu": "1",
"doc_picture": "yes",
"doc_contract": "no",
"doc_name": "i12fsdf8.jpg"
},
{
"ID": "2",
"IDu": "1",
"doc_picture": "yes",
"doc_contract": "no",
"doc_name": "i12fffffsdf8.jpg"
},
{
"ID": "2",
"IDu": "1",
"doc_picture": "no",
"doc_contract": "yes",
"doc_name": "dddf8_doc.jpg"
}
],
"5": [
{
"IDaut": "5",
"IDusr": "1",
"doc_picture": null,
"doc_contract": null,
"doc_name": null
}
],
"6": [
{
"ID": "6",
"IDu": "1",
"doc_picture": "no",
"doc_contract": "yes",
"doc_name": "d8_doc.jpg"
},
{
"ID": "6",
"IDu": "1",
"doc_picture": "yes",
"doc_contract": "no",
"doc_name": "f8.jpg"
},
{
"ID": "6",
"IDu": "1",
"doc_picture": "yes",
"doc_contract": "no",
"doc_name": "d.jpg"
},
{
"ID": "6",
"IDu": "1",
"doc_picture": "no",
"doc_contract": "yes",
"doc_name": "gg_doc.jpg"
}
]
};
如您所见,每个关联数组的唯一区别仅在于 doc_name。
我需要的是生成这个数组...
$aa = {
"1": [
{
"ID": "1",
"IDu": "1",
"doc_name": "images201103928128.jpg_picture",
"doc_name": "images20110_doc.jpg_document",
"doc_name": "28128.jpg_picture",
"doc_name": "i128.jpg_picture"
},
],
"2": [
{
"ID": "2",
"IDu": "1",
"doc_name": "i12fsdf8.jpg_picture",
"doc_name": "i12fffffsdf8.jpg_picture",
"doc_name": "dddf8_doc.jpg_document"
},
],
"5": [
{
"IDaut": "5",
"IDusr": "1",
"doc_picture": null,
"doc_contract": null,
"doc_name": null
}
],
"6": [
{
"ID": "6",
"IDu": "1",
"doc_name": "d8_doc.jpg_document",
"doc_name": "f8.jpg_picture",
"doc_name": "d.jpg_picture",
"doc_name": "gg_doc.jpg_documen"
},
]
};
这是PHP代码...
function get_List($ID)
{
$this->db >select('u.ID,u.IDu,d.doc_picture,
d.doc_contract,d.doc_name,
a.*');
$this->db->from('t_user u');
$this->db->join('t_doc d', 'd.ID=u.ID', 'left');
$this->db->where('u.ID',$ID);
$query = $this->db->get();
$result = $query->result_array();
$group = array();
foreach($result as $val) {
$group[$val['ID']][] = $val;
}
return $group;
}
结果是,我只需要根据他们的 ID 进行分组,并显示所有 doc_name 标签及其相关文档类型,如上所示。
我怎样才能做到这一点?在 PHP 或 Angular 过滤器中...无论您提出什么解决方案,我都会非常高兴...
提前致谢
我会这样做:
$newArray = array();
foreach($aa as $key => $array) {
$ids = array();
foreach($array as $elements) {
$ukey = $elements['ID'].$elements['IDu'];
if(!isset($ids[$ukey])) $ids[$ukey] = array('ID' => $elements['ID'], 'IDu' => $elements['IDu']);
$ext = '';
if($elements['doc_picture'] === 'yes') $ext = '_picture';
else if($elements['doc_contract'] === 'yes') $ext = '_document';
$ids[$ukey]['doc_name'][] = $elements['doc_name'].$ext;
}
foreach($ids as $id) {
if(!isset($newArray[$key])) $newArray[$key] = array();
array_push($newArray[$key],$id);
}
}
// this will print out what you requested
print_r($newArray);
对此的一些说明:
- 不能有多个
doc_name
键,因为键在数组中必须是唯一的。因此,doc_name
将是一个数组。
- 使用此解决方案,您可以有多个不同的
IDu
数字,它会为这些数字创建一个单独的数组(这是我期望的行为,因为您没有写过)。
我使用以下数组进行测试(请注意,我添加了更多条目以便您可以看到完整的行为):
$aa = array("1" => array(array("ID" => "1","IDu" => "1","doc_picture" => "yes","doc_contract" => "no","doc_name" => "images201103928128.jpg"),
array("ID" => "1","IDu" => "1","doc_picture" => "no","doc_contract" => "yes","doc_name" => "images20110_doc.jpg"),
array("ID" => "1","IDu" => "1","doc_picture" => "yes","doc_contract" => "no","doc_name" => "28128.jpg"),
array("ID" => "1","IDu" => "2","doc_picture" => "yes","doc_contract" => "no","doc_name" => "4567.jpg"),
array("ID" => "1","IDu" => "2","doc_picture" => "no","doc_contract" => "yes","doc_name" => "1234.jpg"),
array("ID" => "1","IDu" => "1","doc_picture" => "yes","doc_contract" => "no","doc_name" => "i128.jpg")),
"2" => array(array("ID" => "2","IDu" => "1","doc_picture" => "yes","doc_contract" => "no","doc_name" => "i12fsdf8.jpg"),
array("ID" => "2","IDu" => "1","doc_picture" => "yes","doc_contract" => "no","doc_name" => "i12fffffsdf8.jpg"),
array("ID" => "2","IDu" => "1","doc_picture" => "no","doc_contract" => "yes","doc_name" => "dddf8_doc.jpg")),
"5" => array(array("ID" => "5","IDu" => "1","doc_picture" => null,"doc_contract" => null,"doc_name" => null)),
"6" => array(array("ID" => "6","IDu" => "1","doc_picture" => "no","doc_contract" => "yes","doc_name" => "d8_doc.jpg"),
array("ID" => "6","IDu" => "1","doc_picture" => "yes","doc_contract" => "no","doc_name" => "f8.jpg"),
array("ID" => "6","IDu" => "1","doc_picture" => "yes","doc_contract" => "no","doc_name" => "d.jpg"),
array("ID" => "6","IDu" => "1","doc_picture" => "no","doc_contract" => "yes","doc_name" => "gg_doc.jpg")));
我的 PHP 代码得到以下数组结果。
$aa = {
"1": [
{
"ID": "1",
"IDu": "1",
"doc_picture": "yes",
"doc_contract": "no",
"doc_name": "images201103928128.jpg"
},
{
"ID": "1",
"IDu": "1",
"doc_picture": "no",
"doc_contract": "yes",
"doc_name": "images20110_doc.jpg"
},
{
"ID": "1",
"IDu": "1",
"doc_picture": "yes",
"doc_contract": "no",
"doc_name": "28128.jpg"
},
{
"ID": "1",
"IDu": "1",
"doc_picture": "yes",
"doc_contract": "no",
"doc_name": "i128.jpg"
}
],
"2": [
{
"ID": "2",
"IDu": "1",
"doc_picture": "yes",
"doc_contract": "no",
"doc_name": "i12fsdf8.jpg"
},
{
"ID": "2",
"IDu": "1",
"doc_picture": "yes",
"doc_contract": "no",
"doc_name": "i12fffffsdf8.jpg"
},
{
"ID": "2",
"IDu": "1",
"doc_picture": "no",
"doc_contract": "yes",
"doc_name": "dddf8_doc.jpg"
}
],
"5": [
{
"IDaut": "5",
"IDusr": "1",
"doc_picture": null,
"doc_contract": null,
"doc_name": null
}
],
"6": [
{
"ID": "6",
"IDu": "1",
"doc_picture": "no",
"doc_contract": "yes",
"doc_name": "d8_doc.jpg"
},
{
"ID": "6",
"IDu": "1",
"doc_picture": "yes",
"doc_contract": "no",
"doc_name": "f8.jpg"
},
{
"ID": "6",
"IDu": "1",
"doc_picture": "yes",
"doc_contract": "no",
"doc_name": "d.jpg"
},
{
"ID": "6",
"IDu": "1",
"doc_picture": "no",
"doc_contract": "yes",
"doc_name": "gg_doc.jpg"
}
]
};
如您所见,每个关联数组的唯一区别仅在于 doc_name。
我需要的是生成这个数组...
$aa = {
"1": [
{
"ID": "1",
"IDu": "1",
"doc_name": "images201103928128.jpg_picture",
"doc_name": "images20110_doc.jpg_document",
"doc_name": "28128.jpg_picture",
"doc_name": "i128.jpg_picture"
},
],
"2": [
{
"ID": "2",
"IDu": "1",
"doc_name": "i12fsdf8.jpg_picture",
"doc_name": "i12fffffsdf8.jpg_picture",
"doc_name": "dddf8_doc.jpg_document"
},
],
"5": [
{
"IDaut": "5",
"IDusr": "1",
"doc_picture": null,
"doc_contract": null,
"doc_name": null
}
],
"6": [
{
"ID": "6",
"IDu": "1",
"doc_name": "d8_doc.jpg_document",
"doc_name": "f8.jpg_picture",
"doc_name": "d.jpg_picture",
"doc_name": "gg_doc.jpg_documen"
},
]
};
这是PHP代码...
function get_List($ID)
{
$this->db >select('u.ID,u.IDu,d.doc_picture,
d.doc_contract,d.doc_name,
a.*');
$this->db->from('t_user u');
$this->db->join('t_doc d', 'd.ID=u.ID', 'left');
$this->db->where('u.ID',$ID);
$query = $this->db->get();
$result = $query->result_array();
$group = array();
foreach($result as $val) {
$group[$val['ID']][] = $val;
}
return $group;
}
结果是,我只需要根据他们的 ID 进行分组,并显示所有 doc_name 标签及其相关文档类型,如上所示。
我怎样才能做到这一点?在 PHP 或 Angular 过滤器中...无论您提出什么解决方案,我都会非常高兴...
提前致谢
我会这样做:
$newArray = array();
foreach($aa as $key => $array) {
$ids = array();
foreach($array as $elements) {
$ukey = $elements['ID'].$elements['IDu'];
if(!isset($ids[$ukey])) $ids[$ukey] = array('ID' => $elements['ID'], 'IDu' => $elements['IDu']);
$ext = '';
if($elements['doc_picture'] === 'yes') $ext = '_picture';
else if($elements['doc_contract'] === 'yes') $ext = '_document';
$ids[$ukey]['doc_name'][] = $elements['doc_name'].$ext;
}
foreach($ids as $id) {
if(!isset($newArray[$key])) $newArray[$key] = array();
array_push($newArray[$key],$id);
}
}
// this will print out what you requested
print_r($newArray);
对此的一些说明:
- 不能有多个
doc_name
键,因为键在数组中必须是唯一的。因此,doc_name
将是一个数组。 - 使用此解决方案,您可以有多个不同的
IDu
数字,它会为这些数字创建一个单独的数组(这是我期望的行为,因为您没有写过)。
我使用以下数组进行测试(请注意,我添加了更多条目以便您可以看到完整的行为):
$aa = array("1" => array(array("ID" => "1","IDu" => "1","doc_picture" => "yes","doc_contract" => "no","doc_name" => "images201103928128.jpg"),
array("ID" => "1","IDu" => "1","doc_picture" => "no","doc_contract" => "yes","doc_name" => "images20110_doc.jpg"),
array("ID" => "1","IDu" => "1","doc_picture" => "yes","doc_contract" => "no","doc_name" => "28128.jpg"),
array("ID" => "1","IDu" => "2","doc_picture" => "yes","doc_contract" => "no","doc_name" => "4567.jpg"),
array("ID" => "1","IDu" => "2","doc_picture" => "no","doc_contract" => "yes","doc_name" => "1234.jpg"),
array("ID" => "1","IDu" => "1","doc_picture" => "yes","doc_contract" => "no","doc_name" => "i128.jpg")),
"2" => array(array("ID" => "2","IDu" => "1","doc_picture" => "yes","doc_contract" => "no","doc_name" => "i12fsdf8.jpg"),
array("ID" => "2","IDu" => "1","doc_picture" => "yes","doc_contract" => "no","doc_name" => "i12fffffsdf8.jpg"),
array("ID" => "2","IDu" => "1","doc_picture" => "no","doc_contract" => "yes","doc_name" => "dddf8_doc.jpg")),
"5" => array(array("ID" => "5","IDu" => "1","doc_picture" => null,"doc_contract" => null,"doc_name" => null)),
"6" => array(array("ID" => "6","IDu" => "1","doc_picture" => "no","doc_contract" => "yes","doc_name" => "d8_doc.jpg"),
array("ID" => "6","IDu" => "1","doc_picture" => "yes","doc_contract" => "no","doc_name" => "f8.jpg"),
array("ID" => "6","IDu" => "1","doc_picture" => "yes","doc_contract" => "no","doc_name" => "d.jpg"),
array("ID" => "6","IDu" => "1","doc_picture" => "no","doc_contract" => "yes","doc_name" => "gg_doc.jpg")));