Objects Array Получить конкретный объект и отобразить вместе PHP - PullRequest
0 голосов
/ 31 мая 2018

Я столкнулся с проблемой здесь и мне нужна помощь.

Я сохранил в своей базе данных массив json_aray с объектами.

После декодирования и print_r это я получаю этот результат.

Array ( 
[0] => stdClass Object ( 
    [Title] => Image 
    [Info] => info
    [ImageURL] => url.jpg ) 
[1] => stdClass Object ( 
    [Title] => Image 
    [Info] => info
    [ImageURL] => url.jpg )     
[2] => stdClass Object ( 
    [Title] => Accommodation 
    [Info] => info
    [ImageURL] => image.jpg ) 
[3] => stdClass Object ( 
    [Title] => Accommodation 
    [Info] => info
    [ImageURL] => image.jpg ) 
[4] => stdClass Object ( 
    [Title] => Accommodation 
    [Info] => info
    [ImageURL] => image.jpg ) 
[5] => stdClass Object ( 
    [Title] => Image 
    [Info] => info
    [ImageURL] => image.jpg )     
[6] => stdClass Object ( 
    [Title] => Location 
    [Info] => info
    [ImageURL] => image.jpg )     
)

Итак, вот CASE:

Я пытаюсь создать div для каждого отдельного Object->Title например,

Я пыталсячтобы проверить это с помощью цикла foreach, но в результате было создано 5 различных divs вместо одного.

Есть ли в php встроенная функция для получения всех $obj->Info, если $obj->Title == 'foo' иликак-нибудь проверить перед циклом foreach, какие данные у массива, и разделить их?

Что я сделал в своем коде ниже

   while($row = sqlsrv_fetch_array($get_details)) {
        $a = $row['additionalInformation'];
        $b = json_decode($a);
        $c = $b->AdditonalInfo;
        foreach ($c as $d){ 
            echo '<div class="class">';
            if(($d->Title !== 'Image')){
                echo '<h2>'.$d->Title.'</h2>';
                echo '<p>'.$d->Info.'</p>';
            }
            echo "</div>";
        }
    }

UPDATE

  1. Измените мой код на действительный

  2. Вот что я получаю

enter image description here

Но мне нужно создать Жилье или каждый такой же Title только один раз и все Info, которые имеют Title == 'Accommodation' под этим div.

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

Итак, чтобы подвести итог, мне нужно отобразить все [Info] с одинаковыми [Title] водин div и создайте отдельный div для каждого уникального '[Title]'

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Требования: Показать «вложенные группы» в последовательном потоке записей.Здесь у нас есть вложенная группа, обозначенная полем «Заголовок».

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

Теперь первая мысль - использовать цикл «foreach».Это не самый ясный подход, потому что вы не можете определить конец группы, посмотрев на текущую запись.Кроме того, цикл foreach читает следующую запись в конце цикла.Итак, вы заканчиваете тем, что пытаетесь понять, где находитесь в группе, чтобы знать, что делать.

Я использую технику под названием «читать вперед».Идея состоит в том, чтобы прочитать запись перед циклом и прочитать следующую запись сразу после обработки текущей.Суть в том, что вы обрабатываете все записи в группе внутри цикла.

Итак, логика представляет собой итерацию:

  • Запуск процесса группы - уже есть первая запись группы - важно.
  • Обработка всех деталейзаписи, принадлежащие группе - записи читаются внутри этого цикла.
  • Обрабатывает конец группы - текущая запись является первой из следующей группы
  • повторяется для каждой группы.

Это облегчает понимание кода.

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

Обратите внимание, что код соответствует структуреданных.В коде всегда есть одно место для ввода требуемого действия для этого конкретного элемента данных.

Полный рабочий исходный код на eval.in

Запустите код

outputAllGroups($src);
exit();

Обработка всех групп

function outputAllGroups(&$inputList) 
{
    reset($inputList);  
    $currentDetails = current($inputList); // read the first record 

    while ($currentDetails !== false) { // not end of records

        // start the title group
        $currentTitle = $currentDetails->Title; 
        outputGroupHeader($currentDetails);

        // process all records in the group
        while (    $currentDetails !== false 
                && $currentDetails->Title === $currentTitle) { 

            outputDetails($currentDetails);

            $currentDetails = readNextDetails($inputList); // may end group
        }

        // end the title group 
        outputGroupFooter($currentTitle);
    }
}

Функции для отдельных действий

function outputGroupHeader($details)
{
    echo '<div class="TitleGroup">'. "<!-- Start Group: {$details->Title} -->". PHP_EOL
       . '<div class="Title">'. $details->Title .'</div>' . PHP_EOL; 
}

function outputGroupFooter($title)
{
    echo '</div>'. "<!-- End Group: {$title}  -->". PHP_EOL;
}

function outputDetails($details)
{
    echo '<div class="details">'. PHP_EOL,  
            $details->Info . PHP_EOL,  
            $details->ImageURL .PHP_EOL,
         '</div>' . PHP_EOL;            
}

function readNextDetails(&$inputList)
{
    $allOk = next($inputList); // advance next
    return $allOk !== false ? current($inputList) : $allOk; // advance next
}

Вывод

<div class="TitleGroup"><!-- Start Group: Image -->
<div class="Title">Image</div>
<div class="details">
info1
url1.jpg
</div>
<div class="details">
info2
url2.jpg
</div>
</div><!-- End Group: Image  -->
<div class="TitleGroup"><!-- Start Group: Accommodation -->
<div class="Title">Accommodation</div>
<div class="details">
info3
image3.jpg
</div>
<div class="details">
info4
image4.jpg
</div>
<div class="details">
info5
image5.jpg
</div>
</div><!-- End Group: Accommodation  -->
<div class="TitleGroup"><!-- Start Group: Image -->
<div class="Title">Image</div>
<div class="details">
info6
image6.jpg
</div>
</div><!-- End Group: Image  -->
<div class="TitleGroup"><!-- Start Group: Location -->
<div class="Title">Location</div>
<div class="details">
info7
image7.jpg
</div>
</div><!-- End Group: Location  -->

Данные

$src = Array ( 
    '0' => (object) array( 
        'Title' => 'Image', 
        'Info' => 'info1',
        'ImageURL' => 'url1.jpg', ), 
    '1' => (object) array( 
        'Title' => 'Image', 
        'Info' => 'info2',
        'ImageURL' => 'url2.jpg', ),     
    '2' => (object) array( 
        'Title' => 'Accommodation', 
        'Info' => 'info3',
        'ImageURL' => 'image3.jpg', ), 
    '3' => (object) array( 
        'Title' => 'Accommodation', 
        'Info' => 'info4',
        'ImageURL' => 'image4.jpg', ), 
    '4' => (object) array( 
        'Title' => 'Accommodation', 
        'Info' => 'info5',
        'ImageURL' => 'image5.jpg', ), 
    '5' => (object) array( 
        'Title' => 'Image', 
        'Info' => 'info6',
        'ImageURL' => 'image6.jpg', ),     
    '6' => (object) array( 
        'Title' => 'Location', 
        'Info' => 'info7',
        'ImageURL' => 'image7.jpg', ),     
    );    
0 голосов
/ 31 мая 2018

Привет, пожалуйста, сделай так, чтобы получить для каждого результата уникальный div.Для 2 очереди (есть ли в php встроенная функция для получения всей $ obj-> Info, если $ obj-> Title == 'foo' или каким-либо образом проверять перед циклом foreach, какие данные есть в массиве, и разделять их?) Я найду какое-нибудь решение поздно:)

$a = $row['additionalInformation'];
$b = json_decode($a);
$c = $b->AddInfo;
$createDivArray = array();
echo '<div class="style1">'; 
foreach ($c as $value){
   if (in_array($value->Title, $createDivArray)) {
      continue;
   }
   $createDivArray[] = $value->Title; 

   echo "<h4>$value->Title</h4>";
   echo "<p>$value->Info</p>";
}
echo "</div>";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...