如何在不使用foreach构造的情况下组合数组值和单独的常量?

时间:2015-08-29 06:06:32

标签: php arrays loops foreach

我正在尝试找到一种更简单的方法来从现有数组和值创建新数组。我想优化的两个例程在构造上类似。第一个形式是:

$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的数组运算符,使用更短,更高效的例程来优化这些过程? (当然,有很多,我找不到一个似乎符合法案的。)

5 个答案:

答案 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)

http://techblog.procurios.nl/k/n618/news/view/34972/14863/cache-a-large-array-json-serialize-or-var_export.html