2016-04-15 83 views
2

我從Web服務中提取大量數據,使我回到一個多維混合數組,其中只需要10%的信息。 我正在尋找一種靈活的方式來僅保留我的目的所需的信息。減少數組信息

我沒有找到一個PHP函數或方法來做到這一點。

不要誤會我的意思,我不想過濾值,也不想分片元素。

把它放到數據庫的角度來看,我想「簡單地」放下一些列。或者更好:我想保留我需要的列,並刪除我不需要的所有其他列表,但我不知道。

E.G.

$big_array = array(
array("year" => 1979, "name" => "Miller", "wage" => "100", "children"=>array("John", "Kate")), 
array("year" => 1983, "name" => "Smith", "wage" => "200"), 
array("year" => 1980, "name" => "Mayer", "wage" => "200", "children"=>array("Tom")), 
array("year" => 1981, "name" => "Mayer", "wage" => "100"), 
array("year" => 1980, "name" => "Clinton", "wage" => "300", "children"=>array("Rosa", "Dick", "Christine")), 
array("year" => 1981, "name" => "Bush", "wage" => "200")); 
print_r($big_array); 

會給我:

Array 
(
    [0] => Array 
     (
      [year] => 1979 
      [name] => Miller 
      [wage] => 100 
      [children] => Array 
       (
        [0] => John 
        [1] => Kate 
       ) 

     ) 

    [1] => Array 
     (
      [year] => 1983 
      [name] => Smith 
      [wage] => 200 
     ) 

    [2] => Array 
     (
      [year] => 1980 
      [name] => Mayer 
      [wage] => 200 
      [children] => Array 
       (
        [0] => Tom 
       ) 

     ) 

    [3] => Array 
     (
      [year] => 1981 
      [name] => Mayer 
      [wage] => 100 
     ) 

    [4] => Array 
     (
      [year] => 1980 
      [name] => Clinton 
      [wage] => 300 
      [children] => Array 
       (
        [0] => Rosa 
        [1] => Dick 
        [2] => Christine 
       ) 

     ) 

    [5] => Array 
     (
      [year] => 1981 
      [name] => Bush 
      [wage] => 200 
     ) 

) 

現在問題來了。我不知道我得到了什麼額外的信息,因爲我不是Web服務的主人。我只知道我需要的列。在這種情況下,我只需要「名稱」和「孩子」。我不想因爲沒有孩子而失去數組元素。

所以返回的數組應該是這樣的:

Array 
(
    [0] => Array 
     (
      [name] => Miller 
      [children] => Array 
       (
        [0] => John 
        [1] => Kate 
       ) 

     ) 

    [1] => Array 
     (
      [name] => Smith 
     ) 

    [2] => Array 
     (
      [name] => Mayer 
      [children] => Array 
       (
        [0] => Tom 
       ) 

     ) 

    [3] => Array 
     (
      [name] => Mayer 
     ) 

    [4] => Array 
     (
      [name] => Clinton 
      [children] => Array 
       (
        [0] => Rosa 
        [1] => Dick 
        [2] => Christine 
       ) 

     ) 

    [5] => Array 
     (
      [name] => Bush 
     ) 

) 

因此,功能應該是這個樣子:

$small_array=function($big_array, array("name","children")); 

包含鍵/列的一個陣列,以保持第二個參數。

有什麼想法?

回答

2

試試這個:

$big_array = array(
array("year" => 1979, "name" => "Miller", "wage" => "100", "children"=>array("John", "Kate")), 
array("year" => 1983, "name" => "Smith", "wage" => "200"), 
array("year" => 1980, "name" => "Mayer", "wage" => "200", "children"=>array("Tom")), 
array("year" => 1981, "name" => "Mayer", "wage" => "100"), 
array("year" => 1980, "name" => "Clinton", "wage" => "300", "children"=>array("Rosa", "Dick", "Christine")), 
array("year" => 1981, "name" => "Bush", "wage" => "200")); 

$reqField = array('name','children'); 
$a = optimizeArray($big_array,$reqField); 
echo "<pre>"; 
     print_r($a); 

function optimizeArray($big_array,$reqField) 
{ 
    $retArr = array(); 
    foreach($big_array as $mk=>$arr) 
    { 
     foreach($arr as $k=>$v) 
     { 
      if(in_array($k,$reqField) && isset($arr[$k])) 
      { 
       $retArr[$mk][$k] = $v; 
      } 

     } 

    } 
    return $retArr; 
} 
+1

正確的,但用戶需要的功能,所以你需要將轉換帶功能的代碼。 – RJParikh

1

你可以試試這個功能 -

$small_array = factor_array($big_array, array("name","children")); 


/* 
$main the big array 
$keys the indexes to be extracted 
*/ 
function factor_array($main, $keys) { 
    $temp = array(); 
    //loop through the big array 
    foreach($main as $index => $array) { 
     // loop through the keys array 
     foreach($keys as $key) { 
      if(isset($array[$key])) {// check if the key is set 
       $temp[$index][$key] = $array[$key]; // store with the key 
      } 
     } 

    } 
    return $temp; 
}; 

Fiddle

0

好了,兩個答案都對我的問題是正確的。我想感謝你們倆。 但經過測試,我意識到還有更深的數組元素。 所以我想我們需要一個迭代的,遞歸的解決方案,這是遠遠超出我的知識。

$big_array = array(
array("year" => 1979, "name" => "Miller", "wage" => "100", "children"=>array("John", "Kate")), 
array("year" => 1983, "name" => "Smith", "wage" => "200"), 
array("year" => 1980, "name" => "Mayer", "wage" => "200", "children"=>array("Tom")), 
array("year" => 1981, "name" => "Mayer", "wage" => "100"), 
array("year" => 1980, "name" => "Clinton", "wage" => "300", "children"=>array("Rosa"=>array("Pet"=>array("Clover")), "Dick", "Christine")), 
array("year" => 1981, "name" => "Bush", "wage" => "200")); 
print_r($big_array); 

給予我

Array 
(
    [0] => Array 
     (
      [name] => Miller 
      [children] => Array 
       (
        [0] => John 
        [1] => Kate 
       ) 

     ) 

    [1] => Array 
     (
      [name] => Smith 
     ) 

    [2] => Array 
     (
      [name] => Mayer 
      [children] => Array 
       (
        [0] => Tom 
       ) 

     ) 

    [3] => Array 
     (
      [name] => Mayer 
     ) 

    [4] => Array 
     (
      [name] => Clinton 
      [children] => Array 
       (
        [Rosa] => Array 
         (
          [Pet] => Array 
           (
            [0] => Clover 
           ) 

         ) 

        [0] => Dick 
        [1] => Christine 
       ) 

     ) 

    [5] => Array 
     (
      [name] => Bush 
     ) 

) 

如何優化甚至多維數組?

0

這是一個很瑣碎的操作:使用array_intersect_key減少單一陣列中,只指定的鍵,然後爲陣列中的所有數組做到這一點:

$reduced = array_map(function (array $data) { 
    return array_intersect_key($data, array_flip(['name', 'children'])); 
}, $originalArray);