简体   繁体   中英

Line up two tables

I have two following arrays:

       $array1 = [
            ['date' => '2021', 'income' => 123],
            ['date' => '2022', 'income' => 123],
            ['date' => '2023', 'income' => 123],
            ['date' => '2024', 'income' => 123],
            ['date' => '2025', 'income' => 123],
            ['date' => '2026', 'income' => 123],
            ['date' => '2026', 'income' => 123],
        ];

        $array2 = [
            ['date' => '2019', 'income' => 321],
            ['date' => '2020', 'income' => 321],
            ['date' => '2023', 'income' => 321],
            ['date' => '2024', 'income' => 321],
            ['date' => '2026', 'income' => 321],
            ['date' => '2027', 'income' => 321],
            ['date' => '2028', 'income' => 321],
        ];

Now I want to take the common part of them, based on the date value, starting from the top and bottom, so the result should look like this:

 $result1 = [
            ['date' => '2023', 'income' => 123],
            ['date' => '2024', 'income' => 123],
        ];
 $result2 = [
            ['date' => '2023', 'income' => 321],
            ['date' => '2024', 'income' => 321],
        ];

I have started with something like this:

while($array1[0]['date'] !== $array2[0]['date']) {
    if (count($array1) > count($array2)) {
        array_shift($array1);
    } else {
        array_shift($array2);
    }
}

while ($array1[count($array1)-1]['date'] !== $array2[count($array2)-1]['date']) {
    if (count($array1) > count($array2)) {
        array_pop($array1);
    } else {
        array_pop($array2);
    }
}

But it does not work, if there is a difference in the middle, how can I repair this?

  • Get all years from both arrays, make them unique to remove the doubles and sort them numeric.

  • Iterate through all years. If not both have the same year, just continue, else keep them both and add to the results.

$result1 = [];
$result2 = [];

$years   = array_unique(array_merge(array_column($array1, 'date'), array_column($array2, 'date')));
sort($years, SORT_NUMERIC);

foreach ($years as $year) {
    $hasDate = function($date) use ($year) {
        return $date['date'] === $year;
    };

    $year1 = array_filter($array1, $hasDate);
    $year2 = array_filter($array2, $hasDate);

    if (empty($year1) || empty($year2)) {
        continue;
    }

    $result1[] = current($year1);
    $result2[] = current($year2);
}

print_r($result1);
print_r($result2);

The results look like

Array
(
    [0] => Array
        (
            [date] => 2023
            [income] => 123
        )

    [1] => Array
        (
            [date] => 2024
            [income] => 123
        )

    [2] => Array
        (
            [date] => 2026
            [income] => 123
        )

)
Array
(
    [0] => Array
        (
            [date] => 2023
            [income] => 321
        )

    [1] => Array
        (
            [date] => 2024
            [income] => 321
        )

    [2] => Array
        (
            [date] => 2026
            [income] => 321
        )

)

Use nested loops to find the first matching elements in the two arrays.

Then iterate from there as long as the years continue to match, and push these onto the two result arrays.

<?php

$array1 = [
    ['date' => '2021', 'income' => 123],
    ['date' => '2022', 'income' => 123],
    ['date' => '2023', 'income' => 123],
    ['date' => '2024', 'income' => 123],
    ['date' => '2025', 'income' => 123],
    ['date' => '2026', 'income' => 123],
    ['date' => '2026', 'income' => 123],
];

$array2 = [
    ['date' => '2019', 'income' => 321],
    ['date' => '2020', 'income' => 321],
    ['date' => '2023', 'income' => 321],
    ['date' => '2024', 'income' => 321],
    ['date' => '2026', 'income' => 321],
    ['date' => '2027', 'income' => 321],
    ['date' => '2028', 'income' => 321],
];

$result1 = [];
$result2 = [];

foreach ($array1 as $i => $item1) {
    $found = false;
    foreach ($array2 as $j => $item2) {
        if ($item1['date'] == $item2['date']) {
            $found = true;
            break;
        }
    }
    if ($found) {
        echo "Found at $i and $j\n";
        for (; $i < count($array1) && $j < count($array2) && $array1[$i]['date'] == $array2[$j]['date']; $i++, $j++) {
            $result1[] = $array1[$i];
            $result2[] = $array2[$j];
        }
        break;
    }
}

print_r($result1);
print_r($result2);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM