使用生成器作为多维数组替换
Use Generators as multidimensional array replacement
前段时间我构建了一个工具,一些人告诉我使用生成器而不是简单的数组以获得更好的性能等。我开始使用生成器,但是,生成器的谷歌搜索问题非常无用,因为没有发电机的信息还很多。那么,让我们来回答我的问题
让我们想象一下下面的代码
$array = [0, 1, 2, 3, 4, 5];
$mapper = ['zero', 'one', 'two', 'three', 'four', 'five'];
function mapNumbers($array, $mapper)
{
foreach ($array as $element) {
yield $element => $mapper[$element];
}
}
foreach (mapNumbers($array, $mapper) as $key=>$value) {
print $key . ' | ' . $value . '<br>';
}
这给出了以下输出
0 | zero
1 | one
2 | two
3 | three
4 | four
5 | five
但是,我现在想做的是一个多维的数组。让我们想象一下
$categories = ['food', 'nonfood'];
$products = ['food' => ['meat', 'fish'], 'nonfood' => ['table', 'stool']];
function mapCategories($categories, $products)
{
foreach ($categories as $category) {
yield 'Category' => $category, 'Products' => $products[$category]
}
}
foreach (mapCategories($categories, $products) as $key=>$value) {
// do something
}
这当然行不通,因为这一行给出了错误
yield 'Category' => $category, 'Products' => $products[$category]
我想用生成器做的事情是否可行?第一次学习生成器时,我认为生成器在某些情况下可以替代数组,但在尝试构建多维数组时,它们似乎并不能替代数组。
这可能吗?如果是,如何?如果不是,我将如何将它与生成器结合起来?还是只有生成器或数组?
非常感谢
我想你想要的是这样的:
$categories = ['food', 'nonfood'];
$products = ['food' => ['meat', 'fish'], 'nonfood' => ['table', 'stool']];
function mapCategories($categories, $products)
{
foreach ($categories as $category) {
foreach ($products as $product) {
yield $category => $product;
}
}
}
# OR
function mapCategories($categories, $products)
{
foreach ($categories as $category) {
yield $category => $products[$category];
}
}
虽然您可以使用生成器来实现您想要的:
$categories = ['food', 'nonfood'];
$products = ['food' => ['meat', 'fish'], 'nonfood' => ['table', 'stool']];
function mapCategories($categories, $products) {
foreach ($categories as $category) {
yield ['Category' => $category, 'Products' => $products[ $category]];
}
}
foreach (mapCategories($categories, $products) as $key=>$value) {
echo $key, ' => '; var_dump($value); echo PHP_EOL;
}
除了代码的可读性之外,这样做没有任何实际好处。 Generators 的真正好处是,当您主动 retrieving/generating 动态数据时,当您获得仅在实际需要时保留所需数据的内存优势,并且这样做可能会更快。
简单地重新映射您已经加载到 PHP 内存中的数据不会带来任何速度或内存优势。
在您的情况下,只需使用 array_map() 重新映射数据即可提供您想要的合并结构,同时仍保持良好的可读性:
$categories = ['food', 'nonfood'];
$products = ['food' => ['meat', 'fish'], 'nonfood' => ['table', 'stool']];
foreach (
array_map(
function ($value) use ($products) {
return ['Category' => $value, 'Products' => $products[$value]];
},
$categories
) as $value) {
var_dump($value);
}
前段时间我构建了一个工具,一些人告诉我使用生成器而不是简单的数组以获得更好的性能等。我开始使用生成器,但是,生成器的谷歌搜索问题非常无用,因为没有发电机的信息还很多。那么,让我们来回答我的问题
让我们想象一下下面的代码
$array = [0, 1, 2, 3, 4, 5];
$mapper = ['zero', 'one', 'two', 'three', 'four', 'five'];
function mapNumbers($array, $mapper)
{
foreach ($array as $element) {
yield $element => $mapper[$element];
}
}
foreach (mapNumbers($array, $mapper) as $key=>$value) {
print $key . ' | ' . $value . '<br>';
}
这给出了以下输出
0 | zero
1 | one
2 | two
3 | three
4 | four
5 | five
但是,我现在想做的是一个多维的数组。让我们想象一下
$categories = ['food', 'nonfood'];
$products = ['food' => ['meat', 'fish'], 'nonfood' => ['table', 'stool']];
function mapCategories($categories, $products)
{
foreach ($categories as $category) {
yield 'Category' => $category, 'Products' => $products[$category]
}
}
foreach (mapCategories($categories, $products) as $key=>$value) {
// do something
}
这当然行不通,因为这一行给出了错误
yield 'Category' => $category, 'Products' => $products[$category]
我想用生成器做的事情是否可行?第一次学习生成器时,我认为生成器在某些情况下可以替代数组,但在尝试构建多维数组时,它们似乎并不能替代数组。
这可能吗?如果是,如何?如果不是,我将如何将它与生成器结合起来?还是只有生成器或数组?
非常感谢
我想你想要的是这样的:
$categories = ['food', 'nonfood'];
$products = ['food' => ['meat', 'fish'], 'nonfood' => ['table', 'stool']];
function mapCategories($categories, $products)
{
foreach ($categories as $category) {
foreach ($products as $product) {
yield $category => $product;
}
}
}
# OR
function mapCategories($categories, $products)
{
foreach ($categories as $category) {
yield $category => $products[$category];
}
}
虽然您可以使用生成器来实现您想要的:
$categories = ['food', 'nonfood'];
$products = ['food' => ['meat', 'fish'], 'nonfood' => ['table', 'stool']];
function mapCategories($categories, $products) {
foreach ($categories as $category) {
yield ['Category' => $category, 'Products' => $products[ $category]];
}
}
foreach (mapCategories($categories, $products) as $key=>$value) {
echo $key, ' => '; var_dump($value); echo PHP_EOL;
}
除了代码的可读性之外,这样做没有任何实际好处。 Generators 的真正好处是,当您主动 retrieving/generating 动态数据时,当您获得仅在实际需要时保留所需数据的内存优势,并且这样做可能会更快。 简单地重新映射您已经加载到 PHP 内存中的数据不会带来任何速度或内存优势。
在您的情况下,只需使用 array_map() 重新映射数据即可提供您想要的合并结构,同时仍保持良好的可读性:
$categories = ['food', 'nonfood'];
$products = ['food' => ['meat', 'fish'], 'nonfood' => ['table', 'stool']];
foreach (
array_map(
function ($value) use ($products) {
return ['Category' => $value, 'Products' => $products[$value]];
},
$categories
) as $value) {
var_dump($value);
}