我正在尝试找到一种更简单的方法来从现有数组和值创建新数组。我想优化的两个例程在构造上类似。第一个形式是:
$i = 0;
$new_array = array();
foreach ($my_array as $value) {
$new_array[$i][0] = $constant; // defined previously and unchanging
$new_array[$i][1] = $value; // different for each index of $my_array
$i++;
}
第二个的形式没有一个,但每个常数两个不同的值;注意$ value在索引中的$ key之前:
$i = 0;
$new_array = array();
foreach ($my_array as $key => $value) {
$new_array[$i][0] = $constant; // defined previously and unchanging
$new_array[$i][1] = $value; // different for each index of $my_array
$new_array[$i][2] = $key; // different for each index of $my_array
$i++;
}
有没有办法使用PHP的数组运算符,使用更短,更高效的例程来优化这些过程? (当然,有很多,我找不到一个似乎符合法案的。)
答案 0 :(得分:1)
我相信Wouter Thielen关于其他解决方案的建议实际上对我来说是最好的答案。
对于我提供的第一个案例:
$new_array = array();
// $my_array is numeric, so $key will be index count:
foreach ($my_array as $key => $value) {
$new_array[$key] = array($constant, $value);
};
对于我提供的第二个案例:
// $my_array is associative, so $key will initially be a text index (or similar):
$new_array = array();
foreach ($my_array as $key => $value) {
$new_array[$key] = array($constant, $value, $key);
};
// This converts the indexes to consecutive integers starting with 0:
$new_array = array_values($new_array);
答案 1 :(得分:0)
当你使用数组键而不是$ i-counter
时,它更短$new_array = array();
foreach ($my_array as $key => $value) {
$new_array[$key][0] = $constant; // defined previously and unchanging
$new_array[$key][1] = $value; // different for each index of $my_array
}
答案 2 :(得分:0)
这是一种较短的方法,因为我认为使用内置的array_push函数:
$new_array = array();
foreach ($my_array as $key => $value) {
$new_array[$key] = array();
array_push($new_array[$key],$constant,$value,$key);
};
或者您可以使用array_merge函数执行此操作:
$new_array = array();
foreach ($my_array as $key => $value) {
$new_array[$key] = array_merge((array)$constant,(array)$value,(array)$key);
};
答案 3 :(得分:0)
使用array_map
:
$new_array = array_map(function($v) use ($constant) {
return array($constant, $v);
}, $my_array);
如果您也想使用这些键,那么对于您的第二种情况:
$new_array = array_map(function($k, $v) use ($constant) {
return array($constant, $v, $k);
}, array_keys($my_array), $my_array);
假设在调用者的范围中定义了$constant
变量,您需要使用use ($constant)
将其传递到函数的范围。
array_walk
类似,但会修改您传递给它的数组,因此如果您想更新$my_array
本身,请使用array_walk
。你的第二个案件就变成了这个:
array_walk($my_array, function(&$val, $key) use($constant) {
$val = array($constant, $val, $key);
});
在上面两个例子中,对于第二种情况,你最终会得到一个关联数组(即键仍然是数组的键)。如果要将其转换为数字索引数组,请使用array_values
:
$numerically_indexed = array_values($associative);
答案 4 :(得分:0)
几天前我问过类似的问题,请查看:
PHP - Fastest way to convert a 2d array into a 3d array that is grouped by a specific value
我认为在处理大量数据时,您有一种最佳方式。对于较小的数量,有一个更好的方法,正如我的问题中的基准所建议的那样。
我认为可读性和理解代码也可能是一个问题,我发现你能理解的东西比你没有真正掌握的想法更有价值,因为它通常需要很长时间来理解它们再次,因为在调试问题时可能会非常混乱。
我建议您查看JSON编码数组和序列化数组之间的差异,因为在使用这两者时可能存在重大的性能差异。似乎现在JSON编码的数组是一种更优化的格式(更快),用于保存和处理数据,但是这可能会随着PHP 7的变化而变化。请注意它们也更便于使用。
进一步阅读:
Preferred method to store PHP arrays (json_encode vs serialize)