Php 动态填充多维数组
全部, 我有以下数组和函数,它将根据您指定的数组键创建多维数组。对于传递给函数的每个属性,它将向数组添加另一个维度。可以将其视为数组排序 提供的函数工作得很好,但它使用eval,我很难想出一个一致的函数,没有它就不会出错 让我们从一个数组开始:Php 动态填充多维数组,php,dynamic,multidimensional-array,Php,Dynamic,Multidimensional Array,全部, 我有以下数组和函数,它将根据您指定的数组键创建多维数组。对于传递给函数的每个属性,它将向数组添加另一个维度。可以将其视为数组排序 提供的函数工作得很好,但它使用eval,我很难想出一个一致的函数,没有它就不会出错 让我们从一个数组开始: $array = array( array(‘name’ => ‘Person1’, ‘username’ => ‘username1’, ‘join_date’ => 12233445566, ‘state’ =&
$array = array(
array(‘name’ => ‘Person1’, ‘username’ => ‘username1’, ‘join_date’ => 12233445566, ‘state’ => ‘NJ’),
array(‘name’ => ‘Person2’, ‘username’ => ‘username2’, ‘join_date’ => 12233445566, ‘state’ => ‘NJ’),
array(‘name’ => ‘Person3’, ‘username’ => ‘username3’, ‘join_date’ => 12233445996, ‘state’ => ‘NY’),
array(‘name’ => ‘Person4’, ‘username’ => ‘username4’, ‘join_date’ => 12233445996, ‘state’ => ‘NJ’),
array(‘name’ => ‘Person5’, ‘username’ => ‘username5’, ‘join_date’ => 12233445566, ‘state’ => ‘NJ’),
array(‘name’ => ‘Person6’, ‘username’ => ‘username6’, ‘join_date’ => 12233445566, ‘state’ => ‘NY’),
array(‘name’ => ‘Person7’, ‘username’ => ‘username7’, ‘join_date’ => 12233445776, ‘state’ => ‘NY’),
array(‘name’ => ‘Person8’, ‘username’ => ‘username8’, ‘join_date’ => 12233445566, ‘state’ => ‘NY’),
array(‘name’ => ‘Person9’, ‘username’ => ‘username9’, ‘join_date’ => 12233445996, ‘state’ => ‘NJ’),
);
下面是一个示例函数:
function createIndex($array, $index){
$index_array = array();
foreach($array as $result){
if(is_array($index)){
$key = '$index_array';
for($i=0;$i<=sizeof($index)-1;$i++){
$key .= "['{$result[$index[$i]]}']";
}
$key .= "[]";
eval("$key = \$result;");
}
else{
$index_array[$result[$index]] = $result;
}
}
return $index_array;
}
print_r(create_index($array, array(‘state’, ‘join_date’)));
所需输出:
Array
(
[NJ] => Array
(
[12233445566] => Array
(
[0] => Array
(
[name] => Person1
[username] => username1
[join_date] => 12233445566
[state] => NJ
)
[1] => Array
(
[name] => Person2
[username] => username2
[join_date] => 12233445566
[state] => NJ
)
[2] => Array
(
[name] => Person5
[username] => username5
[join_date] => 12233445566
[state] => NJ
)
)
[12233445996] => Array
(
[0] => Array
(
[name] => Person4
[username] => username4
[join_date] => 12233445996
[state] => NJ
)
[1] => Array
(
[name] => Person9
[username] => username9
[join_date] => 12233445996
[state] => NJ
)
)
)
[NY] => Array
(
[12233445996] => Array
(
[0] => Array
(
[name] => Person3
[username] => username3
[join_date] => 12233445996
[state] => NY
)
)
[12233445566] => Array
(
[0] => Array
(
[name] => Person6
[username] => username6
[join_date] => 12233445566
[state] => NY
)
[1] => Array
(
[name] => Person8
[username] => username8
[join_date] => 12233445566
[state] => NY
)
)
[12233445776] => Array
(
[0] => Array
(
[name] => Person7
[username] => username7
[join_date] => 12233445776
[state] => NY
)
)
)
)
问题是:为了从相同的数组中获得相同的结果,您可以通过哪些方法克服上述问题?我很好奇别人会怎么做
谢谢这是我要做的。还要注意如何通过引用传入$index_数组。我个人在代码中使用它,因此我可以批量处理大量数据,偶尔也可以取消设置数据 这一切都是关于通过引用存储变量:
function create_index($array, $indexes, &$index_array = array()) {
if(!is_array($indexes)) $indexes = array($indexes);
foreach($array as $result) {
$object = &$index_array;
foreach($indexes as $index){
if(!array_key_exists((string)$result[$index], $object)) {
$object[(string)$result[$index]] = array();
}
$object = &$object[(string)$result[$index]];
}
$object[] = $result;
}
return $index_array;
}
然后使用它:
// You can use it like you did in your question:
print_r(create_index($array, array('state', 'join_date')));
// Or you can process in chunks:
$results = array();
while(/* store data from database in $array */) {
create_index($array, array('state', 'join_date'), &$results);
}
我提出了与Ryan发布的解决方案基本相同的解决方案,但在关键是
int
时遇到了问题。。。因此,数组键的类型转换为string
function createIndex($set, $indexes)
{
$return = array();
if(!is_array($indexes)){
$indexes = array($indexes);
}
foreach($set as $data){
$curr =& $return;
foreach($indexes as $index){
$key = (string)$data[$index];
if(!is_array($curr[$key])){
$curr[$key] = array();
}
$curr =& $curr[$key];
}
$curr[] = $data;
}
return $return;
}
通过引用,我可以得到下面的函数。它工作得很好 它将自动检测树的末端是否存在多个叶子,如果存在,则检测树枝或叶子本身。此外,还可以使用
$merge\u分类器
参数进行合并。例如,这将允许您合并名为count
的列,这将把这些值相加
function createIndex($keys, Array $array, $merge_classifier = NULL, $return_array = array())
{
if(is_string($keys)){
$tmp = $keys;
$keys = array();
$keys[] = $tmp;
}
foreach($array as $result) {
$object = &$return_array;
foreach($keys as $index){
if(!array_key_exists($result[$index], $object)) {
$object[$result[$index]] = array();
}
$object = &$object[$result[$index]];
}
if(!is_null($merge_classifier)){
$object = array_merge($result, array($merge_classifier => ($result[$merge_classifier] + $object[$merge_classifier])));
}
else{
if(sizeof($object) > 0){
$object[] = $result;
}else{
$object = $result;
}
}
}
return $return_array;
}
您可能会考虑使用更丰富的数据结构。主要的问题是,您没有一种可靠的方法来区分列表(从0开始的数字顺序索引)和表示在其上组成组的列的键。你可以通过观察深度来了解这一点……但我认为它越来越难看了。我想一个简单的解决办法是在所有键的前面加上一个字符串,除了真正的数字键。