数组是动态的,可以使用7个或多或少的键,但第一个键永远不会改变。
Array
(
[0] => Array
(
[ProviderID] => 1010
[ProviderName] => HAMZEPOUR, SHOKOUFEH
)
[1] => Array
(
[ContactName] => ABC XYZ
[Address1] => New York
[AddressType] => Physical
)
[2] => Array
(
[ContactName] => ABC XYZ
[Address1] => New York
[AddressType] => Billing
)
[3] => Array
(
[ContactName] => ABC XYZ
[Address1] => New York
[AddressType] => Mailing
)
[4] => Array
(
[AlgorithmID] => 1
[AlgoTitle] => Retro-Term
)
[5] => Array
(
[AlgorithmID] => 2
[AlgoTitle] => Modifier 25 errors
)
[6] => Array
(
[HoldType] => HoldType
[StatusID] => 1
)
[7] => Array
(
[HoldType] => HoldType
[StatusID] => 1
)
[8] => Array
(
[HoldType] => Hold
[StatusID] => 2
)
)
我需要将其更改为:
Array
(
[ProviderInfo] => Array
(
[PORAProviderID] => 1010
[ProviderName] => HAMZEPOUR, SHOKOUFEH
)
[ProviderAddress] => Array
(
[Physical] => Array
(
[ContactName] => ABC XYZ
[Address1] => New York
[AddressType] => Physical
)
[Billing] => Array
(
[ContactName] => ABC XYZ
[Address1] => New York
[AddressType] => Billing
)
[Mailing] => Array
(
[ContactName] => ABC XYZ
[Address1] => New York
[AddressType] => Mailing
)
)
[ProviderAlgorithm] => Array
(
[0] => Array
(
[AlgorithmID] => 1
[AlgoTitle] => Retro-Term
)
[1] => Array
(
[AlgorithmID] => 2
[AlgoTitle] => Modifier 25 errors
)
)
[ProviderException] => Array
(
[0] => Array
(
[HoldType] => HoldType
[StatusID] => 1
)
[1] => Array
(
[HoldType] => HoldType
[StatusID] => 1
)
[2] => Array
(
[HoldType] => Hold
[StatusID] => 2
)
)
)
第一个数组是我从db获取的结果,因为SP有四个结果集,我想按照第二个例子中的方式组织数组。
我试过这样做:
$search_array = $array;
$countb = count($search_array);
$counta = count($search_array) - 1;
//echo $countb;
$key_search = array('AlgorithmID', 'PORAProviderID', 'ContactName', 'HoldType');
$key_new = array('ProviderAlgorithm', 'ProviderInfo', 'ProviderAddress', 'ProviderException');
$b = 0;
while ($b <= $countb) {
$a = 0;
while ($a <= $counta) {
if (array_key_exists($key_search[$b], $search_array[$a])) {
$array[$key_new[$b]] = $array[$a];
unset($array[$a]);
// $a=$a-1;
}
$a++;
}
$b++;
}
这就是我得到的:
Array
(
[ProviderAlgorithm] => Array
(
[AlgorithmID] => 2
[AlgoTitle] => Modifier 25 errors
)
[ProviderInfo] => Array
(
[PORAProviderID] => 1010
[ProviderName] => HAMZEPOUR, SHOKOUFEH
)
[ProviderAddress] => Array
(
[ContactName] => ABC XYZ
[Address1] => New York
[AddressType] => Mailing
)
[ProviderException] => Array
(
[HoldType] => HoldType
[StatusID] => 1
)
)
答案 0 :(得分:2)
为什么不使用foreach遍历第一个数组,然后使用开关来检测期望的键 - &gt;值对的类型:
编辑:紧接下面的代码是错误的。在此代码下方添加了正确的答案。
<?php
$newArray = array();
foreach($array as $arr) {
$keys = array_keys($arr);
switch($keys[0]) {
case "PORAProviderID":
if(!isset($newArray["ProviderInfo"])) {
$newArray["ProviderInfo"] = array();
}
$newArray["ProviderInfo"]["PORAProviderID"] = $arr[0];
$newArray["ProviderInfo"]["ProviderName"] = $arr[1];
break;
case "ContactName":
if(!isset($newArray["ProviderAddress"])) {
$newArray["ProviderAddress"] = array();
}
$newArray["ProviderAddress"][$arr[2]] = array();
$newArray["ProviderAddress"][$arr[2]]["ContactName"] = $arr[0];
$newArray["ProviderAddress"][$arr[2]]["Address1"] = $arr[1];
$newArray["ProviderAddress"][$arr[2]]["AddressType"] = $arr[2];
break;
case "AlgorithmID":
if(isset($newArray["ProviderAlgorithm"])) {
$count = count($newArray["ProviderAlgorithm"]);
} else {
$newArray["ProviderAlgorithm"] = array();
$count = -1;
}
$count++;
$newArray["ProviderAlgorithm"][$count] = array();
$newArray["ProviderAlgorithm"][$count]["AlgorithmID"] = $arr[0];
$newArray["ProviderAlgorithm"][$count]["AlgoTitle"] = $arr[1];
break;
case "HoldType":
if(isset($newArray["ProviderException"])) {
$count = count($newArray["ProviderException"]);
} else {
$newArray["ProviderException"] = array();
$count = -1;
}
$count++;
$newArray["ProviderException"][$count] = array();
$newArray["ProviderException"][$count]["HoldType"] = $arr[0];
$newArray["ProviderException"][$count]["StatusID"] = $arr[1];
break;
}
}
?>
我确信这可以超级简化,但我要在这里理解而不是效率。使用此方法,您可以检查算法和异常,并且不会期望记录数量的任何长度或限制。
编辑:修正了几个错误和问题。我不确定为什么PHP在使用foreach时不会为数组编制索引 - 我可能需要了解我的PHP函数。我为这种困惑道歉。我将离开上面的原始解决方案,以显示不该做的事情。
<?php
$array=array(
0 => array
(
'PORAProviderID' => '1010',
'ProviderName' => 'HAMZEPOUR, SHOKOUFEH',
),
1 => array
(
'ContactName' => 'ABC XYZ',
'Address1' => 'New York',
'AddressType' => 'Physical'
),
2 => array
(
'ContactName' => 'ABC XYZ',
'Address1' => 'New York',
'AddressType' => 'Billing'
),
3 => array
(
'ContactName' => 'ABC XYZ',
'Address1' => 'New York',
'AddressType' => 'Mailing'
),
4 => array
(
'AlgorithmID' => 1,
'AlgoTitle' => 'Retro-Term'
),
5 => array
(
'AlgorithmID' => 1,
'AlgoTitle' => 'Retro-Term'
),
6 => array
(
'HoldType' => 'HoldType',
'StatusID' => 1
),
7 => array
(
'HoldType' => 'HoldType',
'StatusID' => 1
),
8 => array
(
'HoldType' => 'Hold',
'StatusID' => 2
)
);
$newArray = array();
foreach($array as $arr) {
$keys = array_keys($arr);
switch($keys[0]) {
case "PORAProviderID":
if(!isset($newArray["ProviderInfo"])) {
$newArray["ProviderInfo"] = array();
}
$newArray["ProviderInfo"]["PORAProviderID"] = $arr["PORAProviderID"];
$newArray["ProviderInfo"]["ProviderName"] = $arr["ProviderName"];
break;
case "ContactName":
if(!isset($newArray["ProviderAddress"])) {
$newArray["ProviderAddress"] = array();
}
$newArray["ProviderAddress"][$arr['AddressType']] = array();
$newArray["ProviderAddress"][$arr['AddressType']]["ContactName"] = $arr["ContactName"];
$newArray["ProviderAddress"][$arr['AddressType']]["Address1"] = $arr["Address1"];
$newArray["ProviderAddress"][$arr['AddressType']]["AddressType"] = $arr["AddressType"];
break;
case "AlgorithmID":
if(isset($newArray["ProviderAlgorithm"])) {
$count = count($newArray["ProviderAlgorithm"]);
} else {
$newArray["ProviderAlgorithm"] = array();
$count = 0;
}
$newArray["ProviderAlgorithm"][$count] = array();
$newArray["ProviderAlgorithm"][$count]["AlgorithmID"] = $arr["AlgorithmID"];
$newArray["ProviderAlgorithm"][$count]["AlgoTitle"] = $arr["AlgoTitle"];
break;
case "HoldType":
if(isset($newArray["ProviderException"])) {
$count = count($newArray["ProviderException"]);
} else {
$newArray["ProviderException"] = array();
$count = 0;
}
$newArray["ProviderException"][$count] = array();
$newArray["ProviderException"][$count]["HoldType"] = $arr["HoldType"];
$newArray["ProviderException"][$count]["StatusID"] = $arr["StatusID"];
break;
}
}
?>
我是StackOverflow的新手,我必须为造成这么糟糕的第一印象而道歉。
答案 1 :(得分:1)
在答案@ J.Michieli中,他说他的解决方案可以超级简化,我这样做是为了简化流程。此函数可用于n
长度
$key_search = array(
'PORAProviderID' => 'ProviderInfo',
'ContactName' => 'ProviderAddress',
'HoldType' => 'ProviderException',
'AlgorithmID' => 'ProviderAlgorithm'
);
/**
* Reorganize array by categories
* @param array $array
* @param array $key_search keyToSearch=>NewArrayKey
* @return array
*/
function organizeArray($array, $key_search) {
$new_array = array();
if (count($array) == count($array, COUNT_RECURSIVE)) {
//single array
foreach ($key_search as $key => $key_data) {
if (array_key_exists($key, $array)) {
$new_array[$key_data] = array($array);
}
}
} else {
//nested array
foreach ($array as $array_data) {
foreach ($key_search as $key => $key_data) {
if (array_key_exists($key, $array_data)) {
if (isset($new_array[$key_data])) {
$temp = $new_array[$key_data];
array_push($temp, $array_data);
$new_array[$key_data] = $temp;
}else
$new_array[$key_data] = array($array_data);
}
}
}
}
return $new_array;
}
$array = array(
0 => array
(
'PORAProviderID' => '1010',
'ProviderName' => 'HAMZEPOUR, SHOKOUFEH',
),
1 => array
(
'ContactName' => 'ABC XYZ',
'Address1' => 'New York',
'AddressType' => 'Physical'
),
2 => array
(
'ContactName' => 'ABC XYZ',
'Address1' => 'New York',
'AddressType' => 'Billing'
),
3 => array
(
'ContactName' => 'ABC XYZ',
'Address1' => 'New York',
'AddressType' => 'Mailing'
),
4 => array
(
'AlgorithmID' => 1,
'AlgoTitle' => 'Retro-Term'
),
5 => array
(
'AlgorithmID' => 1,
'AlgoTitle' => 'Retro-Term'
),
6 => array
(
'HoldType' => 'HoldType',
'StatusID' => 1
),
7 => array
(
'HoldType' => 'HoldType',
'StatusID' => 1
),
8 => array
(
'HoldType' => 'Hold',
'StatusID' => 2
)
);
Otuput
print_r(organizeArray($array, $key_search));
Array
(
[ProviderInfo] => Array
(
[0] => Array
(
[PORAProviderID] => 1010
[ProviderName] => HAMZEPOUR, SHOKOUFEH
)
)
[ProviderAddress] => Array
(
[0] => Array
(
[ContactName] => ABC XYZ
[Address1] => New York
[AddressType] => Physical
)
[1] => Array
(
[ContactName] => ABC XYZ
[Address1] => New York
[AddressType] => Billing
)
[2] => Array
(
[ContactName] => ABC XYZ
[Address1] => New York
[AddressType] => Mailing
)
)
[ProviderAlgorithm] => Array
(
[0] => Array
(
[AlgorithmID] => 1
[AlgoTitle] => Retro-Term
)
[1] => Array
(
[AlgorithmID] => 1
[AlgoTitle] => Retro-Term
)
)
[ProviderException] => Array
(
[0] => Array
(
[HoldType] => HoldType
[StatusID] => 1
)
[1] => Array
(
[HoldType] => HoldType
[StatusID] => 1
)
[2] => Array
(
[HoldType] => Hold
[StatusID] => 2
)
)
)