Php 从多个数组中创建一个数组并在某个键中连接唯一值

Php 从多个数组中创建一个数组并在某个键中连接唯一值,php,arrays,Php,Arrays,我需要遍历从mysql返回的一组数组,这些数组包含大量重复条目,并从多个数组中创建一个数组。数组中有一个或多个唯一的值,所以我需要保留这些值,但有些方法可以使用逗号或分号将它们连接成一个字符串。到目前为止,我在这方面没有任何运气。这是一个 我需要它来创建这样的单个阵列: Array ( [0] => Array ( [0] => test [1] => test [2] =>

我需要遍历从mysql返回的一组数组,这些数组包含大量重复条目,并从多个数组中创建一个数组。数组中有一个或多个唯一的值,所以我需要保留这些值,但有些方法可以使用逗号或分号将它们连接成一个字符串。到目前为止,我在这方面没有任何运气。这是一个

我需要它来创建这样的单个阵列:

Array
(
    [0] => Array
        (
            [0] => test
            [1] => test
            [2] => test
            [3] => one
            [4] => two
        )

    [1] => Array
        (
            [0] => test1
            [1] => test
            [2] => test
            [3] => three
            [4] => four
        )

    [2] => Array
        (
            [0] => test2
            [1] => test
            [2] => test
            [3] => five, seven
            [4] => six, eight
        )

    [3] => Array
        (
            [0] => test3
            [1] => test
            [2] => test
            [3] => nine
            [4] => ten
        )

)
从这样的数组中

    Array
(
    [0] => Array
        (
            [0] => test
            [1] => test
            [2] => test
            [3] => one
            [4] => two
        )

    [1] => Array
        (
            [0] => test1
            [1] => test
            [2] => test
            [3] => three
            [4] => four
        )

    [2] => Array
        (
            [0] => test2
            [1] => test
            [2] => test
            [3] => five
            [4] => six
        )

    [3] => Array
        (
            [0] => test2
            [1] => test
            [2] => test
            [3] => seven
            [4] => eight
        )

    [4] => Array
        (
            [0] => test3
            [1] => test
            [2] => test
            [3] => nine
            [4] => ten
        )

)
这就是我正在尝试的:

for($i=0; $i < count($arrayBIG); $i++) {
    if($arrayBIG[$i][0] == $arrayBIG[$i+1][0]) {
        $clean[$i] = array(array_unique(array_merge($arrayBIG[$i],$arrayBIG[$i+1]), SORT_REGULAR));
    }
}
for($i=0;$i
我循环了您的初始代码,并且能够将变量重新分配到临时数组中。我从$arrayBIG的每个元素中取出了相同的项目:

$arrayBIG[0][1]
$arrayBIG[1][1]
$arrayBIG[2][1] ...
然后,我对这些数组执行了一个
数组unique
,并将它们内爆为一个字符串。最后,我将该字符串添加到最终的输出数组中。自从我写这篇文章以来,你似乎已经更改了帖子上的问题代码,但是概念应该还是一样的

$arrayBIG = array( 0 => array("test", "test", "test", "one", "two"),
                   1 => array("test", "test", "test", "three", "four"),
                   2 => array("test", "test", "test", "five", "six"));

$new_array = array();

for ($j = 0; $j < count($arrayBIG[0]); $j++) {

    $temp_array = array();

    for ($i = 0; $i < count($arrayBIG); $i++) {
        $temp_array[] = $arrayBIG[$i][$j];
    }

    $new_array[] = implode(', ', array_unique($temp_array));
}

好的,我根据你的最新帖子做了一个新的回答。这一个比前一个版本要多做很多工作,但这里有一个概要:首先,我循环遍历大数组,对于每个第一个元素,我检查它是否也多次出现在数组中。如果有,我记下数组中的每个位置,这样我就知道要“合并”哪些元素,然后再更新

经过一些循环之后,我们可以从所有相似的数组中找到数据的“列”,并使用
array\u unique
将它们合并在一起,然后将它们内爆为一个字符串

最后,重建数组,取消设置原始项,并将新的和改进的数组插入原始位置

// DEFAULT ARRAY
$arrayBIG = array(
    array('test', 'test', 'test', 'one', 'two'),
    array('test1', 'test', 'test', 'three', 'four'),
    array('test1', 'test', 'test', 'asdfasd', '443llpapos'),
    array('test1', 'test', 'test', '94niwnoowi', 'inoinwoinw'),
    array('test2', 'test', 'test', 'five', 'six'),
    array('test2', 'test', 'test', 'seven', 'eight'),
    array('test3', 'test', 'test', 'nine', 'ten')
);


// STORE THE ITEM OF EACH ARRAY INTO AN ARRAY OF ITS OWN SO WE CAN CHECK FOR DUPES
foreach ($arrayBIG AS $item_array) {
    $temp_array[] = $item_array[0];
}

// COUNT THE VALUES OF THE ARRAY AND STORE ANY KEYS THAT APPEAR MORE THAN ONCE
// THESE WILL BE THE ITEMS WE TRY AND MERGE
// THIS WILL NOT BE THE NUMERIC KEY, BUT THE TEXT OF THE KEY - EX: 'test2'
foreach(array_count_values($temp_array) AS $item_count_key => $item_count_val) {
    if ($item_count_val > 1) {
        $dupe_key_array[] = $item_count_key;
    }
}


// LOOP THROUGH THE DUPE KEYS AND FIND THEIR POSITIONS, THEN MERGE THE SIMILAR ITEMS
foreach ($dupe_key_array AS $dupe_key) {

    $dupe_keys = array();
    $new_array = array();


    // FOR EACH MAIN ARRAY, NOTE THE ACTUAL NUMERIC LOCATION OF THE VALUE IN THE MAIN ARRAY
    foreach ($arrayBIG AS $array_big_key => $array_big_val) {

        // WHEN WE FIND A MATCH, ADD THE NUMERIC VALUE TO THE ARRAY
        // THESE WILL BE THE ITEMS THAT WILL BE REPLACED IN THE FINAL ARRAY
        if ($array_big_val[0] == $dupe_key) {
            $dupe_keys[] = $array_big_key;
           }

    }

    // FOR EACH ITEM, PULL OUT THE "COLUMN" AND MERGE THEM
    for($i = 0; $i < count($array_big_val); $i++) {

        $temp_array_1 = array();

        // FOR EACH DUPE, GET EACH INDIVIDUAL ITEM FROM EVERY POSITION AND PUT THEM INTO A TEMP ARRAY
        // THIS WILL BE THE "COLUMN" FOR EACH ARRAY.
        foreach ($dupe_keys AS $dupe_keys_val) {
            $temp_array_1[] = $arrayBIG[$dupe_keys_val][$i];
        }

        // FILTER OUT DUPES AND THEN IMPLODE IT INTO A COMMA-SEPARATED STRING
        $new_array[] = implode(', ', array_unique($temp_array_1));

    }

    // UNSET ALL OF THE ITEMS THAT WE ARE GOING TO BE REPLACING            
    foreach ($dupe_keys AS $array_item_to_remove) {
        unset ($arrayBIG[$array_item_to_remove]);
    }


    // FIND THE FIRST ITEM IN THE ARRAY WE ARE GOING TO REPLACE
    // WE WILL INSERT THE NEW ARRAY AT THIS LOCATION
    $first_array_item_to_replace = array_shift($dupe_keys);

    // SPLICE THE MAIN ARRAY AND ADD IN OUR NEW MERGED ARRAY AT THE FIRST POSITION
    array_splice($arrayBIG, $first_array_item_to_replace, 0, array($first_array_item_to_replace => $new_array));



}
//默认数组
$arrayBIG=数组(
数组('test','test','test','one','two'),
数组('test1','test','test','three','four'),
数组('test1','test','test','asdfasd','443llpapos'),
数组('test1','test','test','94niwnoowi','inoinwoinw'),
数组('test2','test','test','five','six'),
数组('test2','test','test','seven','seek'),
数组('test3','test','test','nine','ten')
);
//将每个数组的项存储到它自己的数组中,以便我们可以检查重复项
foreach($arrayBIG作为$item\u数组){
$temp_数组[]=$item_数组[0];
}
//对数组的值进行计数,并存储多次出现的任何键
//这些将是我们尝试合并的项目
//这将不是数字键,而是键的文本-例如:“test2”
foreach(数组计数值($temp\u数组)为$item\u count\u key=>$item\u count\u val){
如果($item\u count\u val>1){
$dupe_key_array[]=$item_count_key;
}
}
//循环遍历复制键并找到它们的位置,然后合并相似的项
foreach($dupe\u key\u数组作为$dupe\u key){
$dupe_keys=array();
$new_array=array();
//对于每个主数组,请注意值在主数组中的实际数字位置
foreach($arraybigas$array\u big\u key=>$array\u big\u val){
//找到匹配项后,将数值添加到数组中
//这些项目将在最终阵列中被替换
如果($array\u big\u val[0]==$dupe\u key){
$dupe_key[]=$array_big_key;
}
}
//对于每个项目,拉出“列”并合并它们
对于($i=0;$i$new_array));
}

在数据上循环可能比尝试使用
array\u merge
更容易。SQL有更好的选项来过滤重复数据。你就不能扩展SQL查询吗?我发布了一个关于如何做的问题,没有人能回答。一个人说最好在应用程序级别过滤掉它
// DEFAULT ARRAY
$arrayBIG = array(
    array('test', 'test', 'test', 'one', 'two'),
    array('test1', 'test', 'test', 'three', 'four'),
    array('test1', 'test', 'test', 'asdfasd', '443llpapos'),
    array('test1', 'test', 'test', '94niwnoowi', 'inoinwoinw'),
    array('test2', 'test', 'test', 'five', 'six'),
    array('test2', 'test', 'test', 'seven', 'eight'),
    array('test3', 'test', 'test', 'nine', 'ten')
);


// STORE THE ITEM OF EACH ARRAY INTO AN ARRAY OF ITS OWN SO WE CAN CHECK FOR DUPES
foreach ($arrayBIG AS $item_array) {
    $temp_array[] = $item_array[0];
}

// COUNT THE VALUES OF THE ARRAY AND STORE ANY KEYS THAT APPEAR MORE THAN ONCE
// THESE WILL BE THE ITEMS WE TRY AND MERGE
// THIS WILL NOT BE THE NUMERIC KEY, BUT THE TEXT OF THE KEY - EX: 'test2'
foreach(array_count_values($temp_array) AS $item_count_key => $item_count_val) {
    if ($item_count_val > 1) {
        $dupe_key_array[] = $item_count_key;
    }
}


// LOOP THROUGH THE DUPE KEYS AND FIND THEIR POSITIONS, THEN MERGE THE SIMILAR ITEMS
foreach ($dupe_key_array AS $dupe_key) {

    $dupe_keys = array();
    $new_array = array();


    // FOR EACH MAIN ARRAY, NOTE THE ACTUAL NUMERIC LOCATION OF THE VALUE IN THE MAIN ARRAY
    foreach ($arrayBIG AS $array_big_key => $array_big_val) {

        // WHEN WE FIND A MATCH, ADD THE NUMERIC VALUE TO THE ARRAY
        // THESE WILL BE THE ITEMS THAT WILL BE REPLACED IN THE FINAL ARRAY
        if ($array_big_val[0] == $dupe_key) {
            $dupe_keys[] = $array_big_key;
           }

    }

    // FOR EACH ITEM, PULL OUT THE "COLUMN" AND MERGE THEM
    for($i = 0; $i < count($array_big_val); $i++) {

        $temp_array_1 = array();

        // FOR EACH DUPE, GET EACH INDIVIDUAL ITEM FROM EVERY POSITION AND PUT THEM INTO A TEMP ARRAY
        // THIS WILL BE THE "COLUMN" FOR EACH ARRAY.
        foreach ($dupe_keys AS $dupe_keys_val) {
            $temp_array_1[] = $arrayBIG[$dupe_keys_val][$i];
        }

        // FILTER OUT DUPES AND THEN IMPLODE IT INTO A COMMA-SEPARATED STRING
        $new_array[] = implode(', ', array_unique($temp_array_1));

    }

    // UNSET ALL OF THE ITEMS THAT WE ARE GOING TO BE REPLACING            
    foreach ($dupe_keys AS $array_item_to_remove) {
        unset ($arrayBIG[$array_item_to_remove]);
    }


    // FIND THE FIRST ITEM IN THE ARRAY WE ARE GOING TO REPLACE
    // WE WILL INSERT THE NEW ARRAY AT THIS LOCATION
    $first_array_item_to_replace = array_shift($dupe_keys);

    // SPLICE THE MAIN ARRAY AND ADD IN OUR NEW MERGED ARRAY AT THE FIRST POSITION
    array_splice($arrayBIG, $first_array_item_to_replace, 0, array($first_array_item_to_replace => $new_array));



}