1

该数组是动态的,可以有 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
            )
    )

链接我正在尝试新事物的地方

4

2 回答 2

2

为什么不使用 foreach 遍历第一个数组,然后使用 switch 来检测期望的键->值对类型,如下所示:

编辑:下面的代码是错误的。在此代码下方添加了正确答案。

<?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;

    }

}

?>

我相信这可以超级简化,但我在这里是为了理解而不是效率。使用此方法,您还可以检查算法和异常,并且它不需要任何长度或记录数量的限制。

编辑:修复了几个错误和问题。我不确定为什么在使用 foreach 时 PHP 不索引数组 - 我可能需要复习我的 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 很陌生,我必须为给人留下如此糟糕的第一印象而道歉。

于 2013-09-06T17:42:53.163 回答
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
      )
  );

输出

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
                )

        )

)
于 2013-09-09T04:34:11.700 回答