2016-04-15 86 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);