2013-09-06 2 views
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 
        ) 
      ) 

    ) 

Первый массив является то, что я выборки из БД, как результат СП с четырьмя наборами результатов, я хотел бы организовать массив со путь что он выглядит во втором примере.

Я попытался сделать это:

$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 
      ) 
    ) 

Link where I'm trying new things

+0

Ответ на ваш вопрос, вероятно, слишком большой для этого сайта, но я призываю вас взгляните на некоторые функции массива PHP - в вашем распоряжении множество мощных. Например: [ключ] (http://php.net/manual/en/function.key.php), [array_keys] (http://php.net/manual/en/function.array-keys.php) –

+0

Почему вы хотите реорганизовать массив? Какова ваша конечная цель? –

+0

@AndyLester, потому что мне нужно использовать данные в разных местах, а исходный массив не имеет одинаковой длины, всегда часть адреса не обязательно имеет 3 типа всегда, а часть 'Algorithm' и' Exeption' имеют переменное количество в результат может быть от 0 до неограниченного –

ответ

2

Почему бы не использовать Еогеасп перебирать первый массив, а затем используйте переключатель, чтобы определить, какой тип пары ключей-> значений ожидать так:

РЕДАКТИРОВАТЬ: Код, указанный ниже, неверен. Правильный ответ добавлен ниже этого кода.

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

    } 

} 

?> 

Я уверен, что это может быть очень упрощено, но я собираюсь понять здесь, а не эффективность. Используя этот метод, вы также можете проверить алгоритмы и исключения, и он не ожидает длины или ограничения количества записей.

EDIT: Исправлено несколько ошибок и проблем. Я не уверен, почему 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, и я должен извиниться за создание такого плохого первого впечатления.

+0

Я собираюсь попробовать вашу идею ... спасибо, я прокомментирую результаты, но –

+0

Я пошел дальше и закончил скрипт, чтобы проверить также алгоритмы и исключения.Это должно позволить вам заменить '$ newarray' на любой массив, который вы используете, и постоянно добавлять новые записи с течением времени. –

+0

Вы могли бы видеть это http://ideone.com/4I8hGx –

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 
       ) 

     ) 

) 
+1

Отличный рефакторинг! Спасибо за упрощение для лучшего использования! –

Смежные вопросы