将平面关联数组转换为二维关联数组,无需 foreach() 或通过引用传递

问题描述 投票:0回答:2

我想知道除了使用

foreach(
循环来创建我想要的关联二维输出数组之外,还有哪些其他选项。

输入数组是:

$arr = array(
    '4X2' => 86,
    '4X3' => 9,
    '4X4' => 5,
    '6X2' => 14,
    '6X4' => 1
);

我想要实现的输出数组是:

Array
(
    [4X2] => Array
        (
            [title] => 4X2
            [search] => &vconfiguration[]=4X2
            [count] => 86
        )

    [4X3] => Array
        (
            [title] => 4X3
            [search] => &vconfiguration[]=4X2
            [count] => 9
        )

    [4X4] => Array
        (
            [title] => 4X4
            [search] => &vconfiguration[]=4X4
            [count] => 5
        )

    [6X2] => Array
        (
            [title] => 6X2
            [search] => &vconfiguration[]=6X2
            [count] => 14
        )

    [6X4] => Array
        (
            [title] => 6X4
            [search] => &vconfiguration[]=6X4
            [count] => 1
        )    
)

我已经使用

array_walk()
来实现输出,但在其中我使用的是通过引用传递的数组,这是我不想做的。这是我的解决方案,但我想避免通过引用传递结果数组 (&$result)。

$result = array();
array_walk($filterFacet, function($v, $k) use (&$result) {
  $result[$k] = array(  
      'title' => $k,  
      'search' => '&vconfiguration[]=' . $k,  
      'count' => $v  
      );
});
php arrays function multidimensional-array iteration
2个回答
0
投票

这让我觉得这是一个 XY 问题,但是这里......

要直接返回填充的关联二维数组,请使用

array_reduce()
迭代输入数组的键,并使用这些键访问全局范围的原始值。

代码:(演示

var_export(
    array_reduce(
        array_keys($arr),
        fn($result, $k) => $result
            + [
                $k => [
                    'title' => $k,
                    'search' => "&vconfiguration[]=$k",
                    'count' => $arr[$k]
                ]
            ],
        []
    )
);

要通过引用修改原始值,请使用

array_walk()
演示

array_walk(
    $arr,
    fn(&$v, $k) =>
        $v = [
            'title' => $k,
            'search' => "&vconfiguration[]=$k",
            'count' => $v
        ]
);
var_export($arr);

-1
投票

参见现场演示

您可以通过使用

array_map
array_keys

的组合来实现此目的,而无需使用引用传递

方法1

$arr = array(
    '4X2' => 86,
    '4X3' => 9,
    '4X4' => 5,
    '6X2' => 14,
    '6X4' => 1
);

$result = array_map(function ($key, $count) {
    $title = strtolower(str_replace('X', 'x', $key));
    $search = '&vconfiguration[]=' . $key;
    
    return [
        'title' => $key,
        'search' => $search,
        'count' => $count
    ];
}, array_keys($arr), $arr);

$result = array_combine(array_keys($arr), $result);
// Print the output array
echo '<pre>'; print_r($result); echo '</pre>';

方法二:

您可以通过迭代输入数组并创建具有指定结构的新数组来实现所需的输出。

$arr = array(
    '4X2' => 86,
    '4X3' => 9,
    '4X4' => 5,
    '6X2' => 14,
    '6X4' => 1
);

$result = array();

foreach ($arr as $key => $count) {
    // Convert the key to lowercase and replace 'X' with 'x'
    $title = strtolower(str_replace('X', 'x', $key));
    
    // Build the search string
    $search = '&vconfiguration[]=' . $key;

    // Create the output array for the current key
    $result[$title] = array(
        'title' => $key,
        'search' => $search,
        'count' => $count
    );
}

// Print the output array
echo '<pre>'; print_r($result); echo '</pre>';
© www.soinside.com 2019 - 2024. All rights reserved.