Обработка массива с PHP на Javascript

#javascript #php #arrays #bootstrap-modal #filemaker

#javascript #php #массивы #bootstrap-модальный #filemaker

Вопрос:

У меня есть этот массив, который я сгенерировал в PHP и сохранил в переменной с именем «$auction_additionalrevenues». С помощью указанного массива я сгенерировал очень хорошую таблицу данных с использованием bootstrap.

Моя конечная цель — позволить пользователю щелкнуть строку в указанной таблице данных, а затем использовать модальный, чтобы разрешить им редактирование (затем затем создайте строку в таблице).

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

Что я, похоже, не могу понять в данном конкретном случае, так это то, как показать пользователю данные в модели для конкретной строки, которую они щелкнули. Это расстраивает, потому что у меня есть ВСЕ данные в этом многоплановом (или вложенном?) Массив PHP, хранящийся в глобальной переменной. Другими словами, мне не нужно возвращаться к базе данных, чтобы получить эти данные, поскольку они уже есть в массиве / переменной.

Как мне передать все эти данные между отображаемой страницей / Javascript / PHP? Я могу легко повторить запись / строку в JS с помощью «onclick», как показано ниже.

onClick=showadrev()

Когда я это делаю, я могу записать $ mkey ($ mkey = index / row) в журнал консоли или предупредить об этом без проблем.

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

Вот мой массив:

 Array
(
    [0] => Array
        (
        [0] => Raffle
        [1] => Pick of Live
        [2] => 
        [3] => 100
        [4] => 150
        [5] => Cocktail Only
        [6] => Struggled a bit, offered some from the stage to hit the minimum
    )

    [1] => Array
    (
        [0] => Raffle
        [1] => Ticket/Tangible
        [2] => $1000 gift certificate to Canlis
        [3] => 25
        [4] => Unlimited
        [5] => Cocktail Only
        [6] => Really don't know how this did, but the box was pretty full of tickets
    )

[2] => Array
    (
        [0] => Game
        [1] => Ticket/Tangible
        [2] => The Horse Race. Everyone is a winner. Receive a gift certificate ranging from $25 to $99.
        [3] => 25
        [4] => Unlimited
        [5] => Cocktail Only
        [6] => Great participation
    )

[3] => Array
    (
        [0] => Other
        [1] => Mystery/ Blind Pull
        [2] => Wine Pull
        [3] => 25
        [4] => 50
        [5] => cocktail only
        [6] => There was about a dozen or so left
    )

[4] => Array
    (
        [0] => Other
        [1] => Ticket/Tangible
        [2] => Centerpiece sales
        [3] => 25
        [4] => 35
        [5] => Pre amp; During
        [6] => Unknown
    )
  

)

И вот таблица данных, которую я визуализирую:

 <div class="wizard-step-3">
    <fieldset>
        <legend class="pull-left width-full">Aditional Revenue</legend>
        <!-- <div class="table-responsive"> -->
        <table id="data-table" class="table table-bordered table-striped" width="100%">
            <thead>
                <tr>
                    <th>Item</th>
                    <th>Type</th>
                    <th>Title</th>
                    <th>Price</th>
                    <th>Total Available</th>
                    <th>Sold By</th>
                    <th>Description</th>
                    <th>How did it Go?</th>
                </tr>
            </thead>
            <tbody>
                <?php foreach ($auction_additionalrevenues as $mkey => $adrevitems){
                    $no = $mkey   1;
                    ?><tr style="cursor:pointer;" onClick=showadrev(<?php echo $mkey ; ?>)><?php;
                    echo '<td>'.$no.'</td>';
                    echo '<td>'.$adrevitems[0].'</td>';
                    echo '<td>'.$adrevitems[1].'</td>';
                    echo '<td>'.$adrevitems[3].'</td>';
                    echo '<td>'.$adrevitems[4].'</td>';
                    echo '<td>'.$adrevitems[5].'</td>';
                    echo '<td>'.$adrevitems[2].'</td>';
                    echo '<td>'.$adrevitems[6].'</td>';
                    echo '</tr>';

            } ?>
            </tbody>
        </table>
        <!-- </div> -->
    </fieldset>
</div>
  

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

1. Если я передаю массив непосредственно в JS (вместе с «mkey») без json_encode, я получаю «Неперехваченную синтаксическую ошибку: неожиданный токен u в JSON в позиции 0», и все же, если я передаю его в JS с помощью json_encode, я получаю «Неперехваченную синтаксическую ошибку: недопустимый или неожиданный токен» в журнале консоли.

2. Вы спрашиваете, как поместить весь массив в переменную javascript? например var data = [[Raffle,..],....]

3. кроме того, если я предупреждаю о «typeof», я получаю «Функцию»

4. Спасибо ArtisticPhoenix! Я готов передать весь массив в JS, но с этим тоже не повезло. Я хочу, чтобы пользователь щелкнул третью строку в таблице dat и получил модель, в которой они могут редактировать данные для этой строки. Кажется, я могу правильно передавать эти данные.

5. Вы можете сделать это, если это так var data = <?php echo json_encode( $array ); ?>; , это должно быть нормально, если у вас нет возвратов строк в ваших данных.

Ответ №1:

Вы можете сделать что-то вроде этого

 <script type="text/javascript" >
     var data = <?php echo json_encode( $array ); ?>;
</script>
  

Данные в формате json будут выглядеть следующим образом

   [["Raffle","Pick of Live","",100,150,"Cocktail Only", "Struggled a bit, offered some from the stage to hit the minimum"], .... ]
  

Который будет / должен быть допустимым массивом Javascript, если в нем нет возврата строки. Вы захотите убедиться, что ваш код не в формате json содержит что-то вроде false, если вы извлекаете его из базы json_encode(false) данных вместо фактического массива.

Итак, если вы вставите это на страницу, вы в основном получите что-то вроде этого.

 <script type="text/javascript" >
     var data = [["Raffle","Pick of Live","",100,150,"Cocktail Only", "Struggled a bit, offered some from the stage to hit the minimum"], .... ];
</script>
  

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

    <td class="data_row" data-array="<?php echo implode(',', $array[0]); ?>" >
  

Затем вы можете получить его, выбрав этот td, извлекая данные и используя split.

  var rowData = $('td.data_row').data('array').split(',');
  

Implode превратит его в список, разделенный запятыми, а split аналогичен explode в PHP, чтобы превратить его обратно в массив. Хотя я не совсем уверен, что вы можете поместить массив непосредственно в атрибут data (хотя я сомневаюсь в этом) и избежать этого.

Если вам тоже нужны ключи, это немного сложнее, потому что в JS они будут объектами, но в этом случае вам нужно сначала извлечь их из базы данных или что у вас есть. ( ассоциативный массив против объекта JS)

В качестве альтернативы с имеющейся у вас структурой вы могли бы сделать что-то подобное с помощью jQuery,

 $('tr.row').click( function(event) {
      var rowData = [];
     $(this).find('td').each( function(i,v){
          rowData.push($(this).text());
     });

     //do somthing with rowData
 });
  

Что в основном заключается в том, чтобы найти строку (добавлен класс row, чтобы упростить ее), затем найти все дочерние td, затем выполнить цикл и добавить текст в них в массив.

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

1. Имейте в виду, что в итоге вы можете получить такой JavaScript: var data = ; который приведет к сбою вашего приложения из-за синтаксической ошибки.

2. Конечно, но маловероятно, что он пришел из БД, вы можете просто сделать $array = []; while( $row = $PDO->fetch(PDO:FETCH_ARRAY)){ $array [] = $row; } , тогда их всегда будет массивом по умолчанию, даже если он пустой. 🙂 Но это то, что нужно проверить в PHP перед началом работы. Я только что добавил немного для этого, спасибо!

3. Именно моя точка зрения. Вы делаете слишком много предположений о сгенерированном PHP-коде $array . Я думаю, что более оборонительным подходом при передаче его в JS было бы защитить его и доказать, что JS никогда не выйдет из строя из-за этого…

Ответ №2:

Ответ Artistics должен быть принятым ответом на это. Вот как я это реализовал.

 //echo $system_id;
//echo $system_auth_id;
print_r(json_encode($AuthData));
  

Я оставил закомментированный материал, чтобы вы видели, что я делал, прежде чем я прочитал это и понял, что мне нужно закодировать на стороне PHP перед отправкой в мое JS-приложение.

Результат:

 [{"system_id":"61a694d0-3605-4502-952b-38d87b451a56","system_auth_id":"caa5906f-d9ae-4297-8e9f-5ea8d9ed8b51","system_lastauth_id":"ace681bb-48f5-4831-a23d-6608c696f264","system_rundate":"2019-04-27T22:46:07.090Z","system_auth_lastrundate":"2019-04-27T22:45:57.932Z","system_auth_updated_func":"main_init_auth_extend","system_auth_lastupdateddate":"2019-04-27T22:45:57.932Z","system_auth_lastupdated_func":"main_init_auth_extend","system_auth_request":"0","system_auth_request_lastfunc":"n/a","system_auth_denials":"0","system_auth_denial_lastfunc":"n/a","system_auth_success":"0","system_auth_success_lastfunc":"n/a"}]
  

Предыдущий результат:

 Array( [0] => stdClass Object ( [system_id] => 61a694d0-3605-4502-952b-38d87b451a56 [system_auth_id] => caa5906f-d9ae-4297-8e9f-5ea8d9ed8b51 [system_lastauth_id] => ace681bb-48f5-4831-a23d-6608c696f264 [system_rundate] => 2019-04-27T22:46:07.090Z [system_auth_lastrundate] => 2019-04-27T22:45:57.932Z [system_auth_updated_func] => main_init_auth_extend [system_auth_lastupdateddate] => 2019-04-27T22:45:57.932Z [system_auth_lastupdated_func] => main_init_auth_extend [system_auth_request] => 0 [system_auth_request_lastfunc] => n/a [system_auth_denials] => 0 [system_auth_denial_lastfunc] => n/a [system_auth_success] => 0 [system_auth_success_lastfunc] => n/a ) )