我从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);