Объединить, вывести элементы обоих массивов и выделить их соответствующие элементы

#php

#php

Вопрос:

У меня есть два массива

 $array1 = array('first', 'second', 'third', 'fourth');
$array2 = array('first', 'third', 'fourth', 'fifth', 'sixth');
  

Эти 2 массива имеют общие элементы, и некоторые из элементов доступны только на array1 или array2 .

Что я хочу сделать, так это создать таблицу с 2 столбцами, array1 и array2, как показано ниже:

 array1 ----------- array2
first ----------- first
second ----------- second
third ----------- third
fourth ----------- fourth
fifth ----------- fifth
sixth ----------- sixth
  

но цель здесь в том, чтобы выделить жирным шрифтом элементы, найденные для каждого столбца в соответствующем массиве.

Таким образом, для array1 first, second, third, fourth будет выделено жирным шрифтом, в то время как в array2 first, third, fourth, fifth, sixth будет выделено жирным шрифтом.

Я возился с array_diff и array_merge , но, к сожалению, я зашел в тупик. Я предполагаю, что это должно быть foreach , но я не могу найти различий.

Любая помощь, пожалуйста?

Комментарии:

1. Почему second помещается во вторую строку таблицы, зная, что third во втором массиве индекс тот же, что и second в первом массиве.

2. @revo я думаю создать объединенный вывод обоих массивов, возможно, мой вывод в вопросе неверен…

3. То есть порядок не обязательно имеет значение?

4. @revo да, порядок не обязательно имеет значение

Ответ №1:

Здесь два момента:

  1. Создайте уникальный массив из всех значений
  2. Если значение существует в массиве, выделите формат жирным шрифтом, в противном случае выведите его как есть:
 $arrayOne = array('first', 'second', 'third', 'fourth');
$arrayTwo = array('first', 'third', 'fourth', 'fifth', 'sixth');
// create a unique list
$uniqueValues = array_unique(array_merge($arrayOne, $arrayTwo));
// iterate over and echo a bold or normal value
foreach ($uniqueValues as $value) {
    echo in_array($value, $arrayOne) ? "**$value**" : $value, ' - ';
    echo in_array($value, $arrayTwo) ? "**$value**" : $value, PHP_EOL;
}
  

Вывод:

 **first** - **first**
**second** - second
**third** - **third**
**fourth** - **fourth**
fifth - **fifth**
sixth - **sixth**
  

Ответ №2:

Комбинация array_unique(array_merge()) даст вам каждое значение, существующее в любом массиве.

 $array = array_unique(array_merge($array1, $array2));
  

Повторите этот результат, проверяя наличие каждого значения в соответствующем массиве при выводе вашей таблицы.

Предполагая, что пример CSS:

 .bold {
    font-weight: bold;
}
  

Попробуйте этот PHP:

 echo "<table>n";
echo "<tr><th>array1</th><th>array2</th></tr>n";
foreach( $array as $value ){
    $class1 = in_array($value, $array1)?"bold":"";
    $class2 = in_array($value, $array2)?"bold":"";
    echo "<tr><td class='$class1'>$value</td><td class='$class2'>$value</td></tr>n";
}
echo "</table>n";
  

Это выведет html в следующем фрагменте:

 .bold {
  font-weight: bold;
}  
 <table>
<tr><th>array1</th><th>array2</th></tr>
<tr><td class='bold'>first</td><td class='bold'>first</td></tr>
<tr><td class='bold'>second</td><td class=''>second</td></tr>
<tr><td class='bold'>third</td><td class='bold'>third</td></tr>
<tr><td class='bold'>fourth</td><td class='bold'>fourth</td></tr>
<tr><td class=''>fifth</td><td class='bold'>fifth</td></tr>
<tr><td class=''>sixth</td><td class='bold'>sixth</td></tr>
</table>  

Ответ №3:

Сначала вы должны объединить оба массива в один большой со всеми значениями, затем выполнить сканирование по нему.

Объединение массивов должно выполняться с помощью array_merge или простой операции

В моем решении используется встроенное условие, если есть значение в первом массиве, добавьте его к элементу bolt, иначе просто повторите значение.

Кроме того, не забудьте поместить этот вывод в table элемент

 <?php
$array1 = array('first', 'second', 'third', 'fourth');
$array2 = array('first', 'third', 'fourth', 'fifth', 'sixth');

$merged = $array1   $array2;
foreach($merged as $value){
    echo '<tr>';
    echo '<td>'.(in_array($value, $array1)? '<b>'.$value.'</b>' : $value).'</td>';
    echo '<td>'.(in_array($value, $array2)? '<b>'.$value.'</b>' : $value).'</td>';
    echo '</tr>';
}
  

Комментарии:

1. Привет, я не думаю, что это ответ. Причина этого в том, что даже 2-й столбец для array2 учитывает элементы в array1, array1 не учитывает элементы array2. Итак, если элемент отображается только в array2, то array1 должен отображать его без выделения жирным шрифтом.

2.Я запустить этот код, и результат был, как и ваш описание: первый первый второй второй третий третий четвертого , четвертый , шестой шестой

Ответ №4:

Код

 <?php

$array1 = array('first', 'second', 'third', 'fourth');
$array2 = array('first', 'third', 'fourth', 'fifth', 'sixth');



function boldSame(array $one, array $two) : array
{
    $results = [];
    $allItems = array_unique(array_merge($one, $two));

    $i = 0;
    foreach ($allItems as $item) {

        $results[$i]['value'] = $item;

        if (in_array($item, $one) amp;amp; in_array($item, $two)) {
            $results[$i]['bold'] = true;
        } else {
            $results[$i]['bold'] = false;
        }
        $i  ;
    }

    return $results;

}


function makeTable(array $values) : string 
{

    $html = '<table>' . PHP_EOL;

    foreach ($values as $value) {

        $html .= '<tr>' . PHP_EOL;

            $html .= '<td>';
                if ($value['bold']) {
                    $html .= '<strong>';
                    $html .= $value['value'];
                    $html .= '</strong>';

                } else {
                    $html .= $value['value'];
                }

            $html .= '</td>';

            $html .= '<td>';
                if ($value['bold']) {
                    $html .= '<strong>';
                    $html .= $value['value'];
                    $html .= '</strong>';

                } else {
                    $html .= $value['value'];
                }

            $html .= '</td>' . PHP_EOL;

            $html .= '</tr>' . PHP_EOL;

    }

    $html .= '</table>' . PHP_EOL;

    return $html;
}

echo makeTable(boldSame($array1, $array2));
  

Использование

 echo makeTable(boldSame($array1, $array2));
  

Результат

 <table>
<tr>
<td><strong>first</strong></td><td><strong>first</strong></td>
</tr>
<tr>
<td>second</td><td>second</td>
</tr>
<tr>
<td><strong>third</strong></td><td><strong>third</strong></td>
</tr>
<tr>
<td><strong>fourth</strong></td><td><strong>fourth</strong></td>
</tr>
<tr>
<td>fifth</td><td>fifth</td>
</tr>
<tr>
<td>sixth</td><td>sixth</td>
</tr>
</table>