减少阵列信息


Reduce Array Information

我从web服务中提取了大量数据,这给了我一个多维混合数组,我只需要其中10%的信息。我正在寻找一种灵活的方式,只保留我所需的信息。

我没有找到一个PHP函数或方法来做这件事。

不要误解我的意思,我不想过滤值,也不想切片元素。

从数据库的角度来看,我想"简单地"删除一些列。或者更好:我想保留我需要的专栏,放弃所有其他我不需要和不知道的专栏。

例如

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

现在问题来了。我不知道我得到了什么额外的信息,因为我不是网络服务的大师。我只知道我需要的专栏。在这种情况下,我只需要"name"answers"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
        )
)

因此,函数应该看起来像这样:

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

第二个参数包含要保留的键/列数组。

知道吗?

试试这个:

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

您可以尝试此功能-

$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

好的,我的问题两个答案都是正确的。我要感谢你们两个。但在测试之后,我意识到还有更深层次的数组元素。所以我想我们需要一个迭代的、递归的解决方案,这远远超出了我的知识范围。

我有

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

如何优化多维数组?

这是一个非常琐碎的操作:使用array_intersect_key将单个数组缩减为仅指定的键,然后对数组中的所有数组执行此操作:

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