Проверьте значения вложенных массивов, если они совпадают: объедините данные из обоих - PullRequest
0 голосов
/ 12 февраля 2020

У меня странная ситуация, и я не совсем уверен, будет ли мое решение работать или возможно ... Это для сайта Wordpress, но я надеюсь, что это общий запрос l oop как в отличие от чего-то определенного c для WP ... но давайте попробуем:

У меня есть массив, что-то вроде этого (меняется при поиске сообщений о событиях WP):

$events = Array
(
[0] => WP_Post Object
    (
        [ID] => 8717
        [post_author] => 5
        [post_date] => 2020-01-28 14:25:36
        [post_parent] => 2766
        [post_title] => Film 1
    )
[1] => WP_Post Object
    (
        [ID] => 8716
        [post_author] => 5
        [post_date] => 2020-01-28 14:25:36
        [post_parent] => 2769
        [post_title] => Film 2
    )
[2] => WP_Post Object
    (
        [ID] => 8716
        [post_author] => 5
        [post_date] => 2020-01-28 14:25:39
        [post_parent] => 2766
        [post_title] => Film 1
    )
)

Я oop через массив с foreach:

foreach ( $events as $event ) { global $post; 
    echo tribe_event_featured_image( $event->ID, 'medium' );
    // This outputs an image, pulled from the event post

    echo '<h4>'. $event->post_title . '</h4>';

    tribe_get_start_date($event, false, $format= 'h:i')
    //This outputs a start time, pulled from the event
}

Однако мне нужно сначала проверить, совпадает ли post_parent. Если это так, а не отображать эти элементы отдельно, мне нужно отобразить их вместе.

Таким образом, в настоящее время вывод:

IMAGE
Film 1
10:00

IMAGE
Film 2
12:00

IMAGE 
Film 1
14:00

Однако, Фильм 1 и фильм 3 имеют одно и то же значение ключа "post_parent", поэтому я хочу, чтобы результат был:

IMAGE
Film 1
10:00, 14:00  (Note 14:00 is the time pulled from 3rd object in array)

IMAGE
Film 2
12:00

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Чтобы достичь желаемых результатов, вам нужно отфильтровать время событий по их parent_post и пропустить уже отображенные события или установить post_parent, чтобы убедиться, что это не null или 0, что может достигается путем проверки на empty($event->post_parent).

Кроме того, вам нужно объявить global только один раз, поскольку foreach не разделяет область видимости переменной.

Пример: https://3v4l.org/pYjQJ

global $post;
$matchedParents = [];
foreach ($events as $event) { 
    if (in_array($event->ID, $matchedParents)) {
        /* post_parent has already been output, skip the event */
        continue;
    }

    echo tribe_event_featured_image($event->ID, 'medium');
    echo '<h4>'. $event->post_title . '</h4>';

    /* display the times based on post_parent */
    $eventTimes = [];
    if (empty($event->post_parent)) {
       /* ensure post_parent is not empty */
       $eventTimes[] = tribe_get_start_date($event, false, $format = 'h:i');
     } else {
        foreach ($events as $subEvent) {
           if ($event->post_parent === $subEvent->post_parent) {
            /* store the matched events */
               $matchedParents[] = $subEvent->ID;
            /* store the event times to be output later */
               $eventTimes[] = tribe_get_start_date($subEvent, false, $format = 'h:i');
           }
       }
    }
    /* optionally sort the times */
    natsort($eventTimes);

    /* output the event times as a CSV */
    echo implode(', ', $eventTimes);
}

Результаты

IMAGE
<h4>Film 1</h4>
10:00, 14:00

IMAGE
<h4>Film 2</h4>
14:25

IMAGE
<h4>Film 4</h4>
14:25

IMAGE
<h4>Film 5</h4>
14:00
1 голос
/ 12 февраля 2020

Проверьте этот ответ. Я не проверял это, но надеюсь, что это работает.

    $filtered_data = []; //An temp array
    // loop your array to create a new array with parent id as key
    foreach ( $events as $data ){
        $filtered_data[$data->post_parent][] = $data;
    }

    // loop the new array to display content as you desired
    foreach ( $filtered_data as $event_data ) { global $post; 
        echo tribe_event_featured_image( $event_data[0]->ID, 'medium' );
        // This outputs an image, pulled from the event post, since there can be multiple post ids, it takes first id to get the Image

        echo '<h4>'. $event_data[0]->post_title . '</h4>';  // same here, It will display first post title

// loop the sub array to get all the times
        foreach($event_data as $event) {
            echo  tribe_get_start_date($event, false, $format= 'h:i') . ',';
        }
        //This outputs a start time, pulled from the event
    }
...