2016-04-15 15 views
2

私は大量のデータをWebサービスから取得しています。多量のデータを取得すると、多次元の混合配列が返され、そこからの情報の10%しか必要ありません。 私は自分の目的に必要な情報だけを保持する柔軟な方法を探しています。配列情報を減らす

私はそれを行うPHPの機能や方法が見つかりませんでした。

私は間違ってはいません。私は値をフィルタリングしたくないので、要素をスライスしたくありません。

データベースの観点から見て、私はいくつかの列を「単純に」ドロップしたいと思っています。それ以上は:私は必要な列を保持し、私が必要としないすべての他のものをドロップしたいと私は知らない。

E.G.

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 
     ) 

) 

今、問題が来る:

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

は私にこれを提供します。私はWebサービスのマスターではないので、私はどのような追加情報を得るのか分かりません。私は必要な列だけを知っています。この場合、私は "名前"と "子供"しか必要としません。そして、私は子供がいないという理由だけで、配列の要素を失いたくはありません。

ので、返される配列は、次のようになります維持するためのキー/列の配列を含む第二引数で

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

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 
     ) 

) 

したがって、関数は次のようになります。

答えて

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

[OK]を、両方の答えは私の質問のために正しいです。私は両方に感謝したい。 しかし、それをテストした後、さらに深い配列要素があることに気付きました。 私は私の知識をはるかに超えた反復的な再帰的な解決策が必要だと思います。

私は私に

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 
     ) 

) 

どのようにしても、多次元配列を最適化することができますを与える

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

を得ましたか。

0

それは非常に簡単操作です:その後、指定されたキーのみに単一のアレイを減らし、あなたの配列内のすべてのアレイのためにこれを行うにはarray_intersect_keyを使用します。

$reduced = array_map(function (array $data) { 
    return array_intersect_key($data, array_flip(['name', 'children'])); 
}, $originalArray); 
関連する問題