我正在寻找一种在循环中创建新数组的方法。不是值,而是数组变量。到目前为止,看起来它是不可能的或复杂的,或者我可能还没有找到正确的方法。
例如,我需要附加到数组的动态数量的值。
假设它将是20万个值。我无法将所有这些值分配给一个数组,由于服务器上的内存原因,请跳过此部分
我可以为每个阵列分配最多50 000个值。
这意味着,我需要创建4个数组以适应不同数组中的所有值。但下次,我不知道需要处理多少值。
有没有办法根据每个阵列的固定容量和一定数量的值生成所需数量的数组?
或者必须手动声明数组并且没有解决方法吗? />
我想要实现的是:
$required_number_of_arrays = ceil(count($data)/50000);
for ($i = 1;$i <= $required_number_of_arrays;$i++) {
$new_array$i = array();
foreach ($data as $val) {
$new_array$i[] = $val;
}
}
// Created arrays: $new_array1, $new_array2, $new_array3
答案 0 :(得分:1)
可行的方法是扩展ArrayObject
。您可以限制可以分配的值的数量,这意味着您需要构建一个类而不是$new_array$i = array();
然而,考察generators可能会更好,但是Scuzzy打败了我。
生成器的概念是,对于每个产量,除非再次循环,否则先前的引用是不可访问的。它将以某种方式被覆盖,与数组不同,您可以使用$data[4]
遍历以前的索引。
这意味着您需要直接处理数据。将生成的数据存储到新数组中将抵消其影响。
获取大量数据对于生成器来说没有问题,但是在使用它们之前应该知道它们的概念。
答案 1 :(得分:1)
根据您的评论,听起来您不需要单独的数组变量。您可以重复使用同一个。当它达到最大尺寸时,进行处理并重新初始化:
$max_array_size = 50000;
$n = 1;
$new_array = [];
foreach ($data as $val) {
$new_array[] = $val;
if ($max_array_size == $n++) {
// process $new_array however you need to, then empty it
$new_array = [];
$n = 1;
}
}
if ($new_array) {
// process the remainder if the last bit is less than max size
}
答案 2 :(得分:0)
您可以创建一个数组并使用extract()
从此数组中获取变量:
$required_number_of_arrays = ceil($data/50000);
$new_arrays = array();
for ($i = 1;$i <= $required_number_of_arrays;$i++) {
$new_arrays["new_array$i"] = $data;
}
extract($new_arrays);
print_r($new_array1);
print_r($new_array2);
//...
答案 3 :(得分:0)
我认为在您的情况下,您必须创建一个包含所有生成的数组洞察力的数组。
所以首先在循环之前声明一个变量。
$global_array = [];
洞察循环,您可以生成名称并填充该数组。
$global_array["new_array$i"] = $val;
在循环之后,您可以使用该数组。但我认为最终不会修复你的内存限制问题。如果用200k条目填充5个数组,它应该与填充200k的一个数组相同,数据量是相同的。因此,您可能会在内存限制上以两种方式运行。如果您无法定义限制,则可能是一个问题。
ini_set('memory_limit', '-1');
因此,您只能在不保存数组内容的情况下直接处理值时防止出现此问题。例如,如果运行db查询并直接处理值并仅保存结果。
您可以尝试这样的事情:
foreach ($data as $key => $val) {
$new_array$i[] = $val;
unset($data[$key]);
}
然后,您的值将存储在新数组中,并删除原始数据数组的值。 50k之后你必须创建一个新的。
更轻松地使用array_chunk
将数组拆分为多个部分。
答案 4 :(得分:0)
不需要多个变量。如果要以块的形式处理数据,以便不填充内存,请重用相同的变量。重新分配变量时,前面的变量内容将被垃圾收集。
$chunk_size = 50000;
$number_of_chunks = ceil($data_size/$chunk_size);
for ($i = 0; $i < $data_size; $i += $chunk_size) {
$new_array = array();
foreach ($j = $i * $chunk_size; $j < min($j + chunk_size, $data_size); $j++) {
$new_array[] = get_data_item($j);
}
}
$new_array[$i]
与您提议的$new_array$i
具有相同的目的。
答案 5 :(得分:0)
你可以这样做:
$required_number_of_arrays = ceil(count($data)/50000);
for ($i = 1;$i <= $required_number_of_arrays;$i++) {
$array_name = "new_array_$i";
$$array_name = [];
foreach ($data as $val) {
${$array_name}[] = $val;
}
}