【问题标题】:How to combine multiple arrays that share a common value如何组合多个具有共同值的数组
【发布时间】:2020-09-03 20:00:55
【问题描述】:

我正在创建一个允许比较两个或多个实例的 MySQL 全局变量的网页。用户将使用 mysqli 选择实例和 php 函数来获取结果。 结果将采用以下格式:

Array (
    [0] => Array ( [VARIABLE_NAME] => activate_all_roles_on_login [host1:3306] => OFF )
    [1] => Array ( [VARIABLE_NAME] => admin_address [host1:3306] => 0.0.0.1 )
)
Array ( 
    [0] => Array ( [VARIABLE_NAME] => activate_all_roles_on_login [host1:3307] => OFF )
    [1] => Array ( [VARIABLE_NAME] => admin_address [host1:3307] => 0.0.0.1 )
)
Array ( 
    [0] => Array ( [VARIABLE_NAME] => activate_all_roles_on_login [host3:3308] => OFF )
    [1] => Array ( [VARIABLE_NAME] => admin_address [host3:3308] => 0.0.0.2 )
)

我想将这些组合到变量名值上,如下所示:

[0] => Array ( [VARIABLE_NAME] => activate_all_roles_on_login [host1:3306] => OFF [host1:3307] => OFF [host3:3308] => OFF )

我尝试过使用 array_combine,但这只会弄得一团糟。

这样做的最终目标是制作一个可以轻松变成如下表格的数组:

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    我建议您尝试使用纯 SQL 来实现它,但是如果您必须使用 PHP 来实现它,这里有一些解决方案。

    你的数组:

    $queryResult = [
        [
            ['VARIABLE_NAME' => 'activate_all_roles_on_login', 'host1:3306' => 'OFF'] ,
            ['VARIABLE_NAME' => 'admin_address', 'host1:3306' => '0.0.0.1'] ,
        ],
        [
            ['VARIABLE_NAME' => 'activate_all_roles_on_login', 'host1:3307' => 'OFF'],
            ['VARIABLE_NAME' => 'admin_address', 'host1:3307' => '0.0.0.2'] ,
        ],
        [
            ['VARIABLE_NAME' => 'activate_all_roles_on_login', 'host1:3308' => 'OFF'] ,
            ['VARIABLE_NAME' => 'admin_address', 'host1:3308' => '0.0.0.3'] ,
        ]
    ];
    

    如果您确定'activate_all_roles_on_login' 在结果中始终排在第一位,您的任务可以在一行中完成:

    var_dump(array_merge(...array_column($queryResult, 0)));
    

    但是,如果您的查询结果可能会有所不同,您可以尝试以下方法:

    $result = [];
    foreach ($queryResult as $row) {
        $subresult = array_column($row, null, 'VARIABLE_NAME');
        if (isset($subresult['activate_all_roles_on_login'])) {
            $result[] = $subresult['activate_all_roles_on_login'];
        }
    }
    
    var_dump(array_merge(...$result));
    

    编辑:

    也可以通过两个循环来完成(我猜这有点慢):

    foreach ($queryResult as $row) {
        foreach ($row as $entry) {
            if (isset($entry['VARIABLE_NAME']) && $entry['VARIABLE_NAME'] === 'activate_all_roles_on_login') {
                $result[] = $entry;
            }
        }
    }
    
    var_dump(array_merge(...$result));
    

    【讨论】:

    • 感谢您的回复,因此将有 500 多个值,activate_all_roles_on_login 可能不是第一个值。您是否建议为所有变量创建一个数组,然后使用您为每个变量提供的 for-each 循环?这让我非常接近,唯一的问题是无法动态循环通过它。 $mergedArrays = array_values(array_replace_recursive(array_column($combined[0],NULL,'VARIABLE_NAME'),array_column($combined[1],NULL,'VARIABLE_NAME')));
    • @SilverDB 我又加了一个例子,见编辑
    【解决方案2】:

    我相信MERGE-ARRAY-WITH-COMMON-VALUE 的回答会让我完成我所追求的。

    【讨论】:

      猜你喜欢
      • 2016-10-25
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 2022-01-17
      • 1970-01-01
      • 2020-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多