2014-10-24 2 views
0

Я знаю, что там было много вопросов относительно преобразования PHP массивов в JavaScript, и стандартный ответ вдоль линий:Преобразование PHP массив в JavaScript

tempary=<?php echo json_encode($tmpary); ?>; 

Однако, когда я пытаюсь получить доступ к массиву, я могу 'Доступ к элементам. например

document.write(tempary[2]);         //debug 

, хотя я знаю, что есть 3-й элемент.

Вот фактический код:

global $wpdb; 
$query="SELECT * FROM wp_ta_members"; 
$member_table=$wpdb->get_results($query); 
echo "<p>Size of wp_ta_members table is " . count($member_table) . "</p>";  //debug 
?> 
<script type="text/javascript"> 
var members = []; 
var tempary = []; 
</script> 
<?php 
foreach ($member_table as $member_row) 
    { 
    $tmpary=array($member_row->member_id, 
    ($member_row->current==1)?"current":"not a member", 
    $member_row->date_joined, 
    $member_row->title, 
    $member_row->first_names, 
    $member_row->last_names) 
    ?> 
    <script type="text/javascript"> 
    tempary=<?php echo json_encode($tmpary); ?>; 
    document.write(tempary[2]);         //debug 
    console.log(tempary);         //debug 
    members.push(tempary.concat()); 
</script> 
<?php } 
?> 

Вы заметите, что я на самом деле создать массив массивов, которые я обрабатываю позже, используя цикл:

for (mem in members) 
{ 
document.write(workary.length + " " + members.length + " " + mem.length + " " + members[1] + "<br />");  //debug 
document.write(mem[1] + " " + mem[2] + " " + mem[3] + " " + mem[4] +"<br />");  //debug 
} 

Однако, все это я получаю для tempary [0] - «1», а для любых других элементов - «undefined».

Если я выдаю tempary сам, я получаю строку из всех элементов, разделенных запятыми.

Что мне недостает? Я хочу, чтобы tempary был правильным массивом JavaScript.

К сожалению вернуться еще раз, но это все еще не работает

я добавил следующий код сценария просто проверить концепцию:

var a1 = [100, "scooby", "doo"]; 
var a2 = [200, "soup", "dragon"]; 
var a3 = []; 
a3.push(a1); 
a3.push(a2); 
console.log(a3); 
console.log(a3[0]); 
console.log(a3[1]); 
console.log(a3[1][0] + " " + a3[1][1]); 

И результат :

[Array[3], Array[3]] 
[100, "scooby", "doo"] 
[200, "soup", "dragon"] 
200 soup 

который является правильным!

Когда я запускаю мой реальный код, и выполнить следующие строки (в пределах цикла):

console.log(tempary);         //debug 
    members.push(tempary); 

Я получаю результат:

["78", "current", "2014-01-01", "", "Fred", "Bloggs"] 

который также является правильным (хотя я бы предпочел «78» хранится как число, а не строка, но это еще одна история).

Когда же я выполнить цикл, чтобы распечатать содержимое массива массивов с использованием:

for (mem in members) 
    { 
    console.log(members.length + " " + mem.length + " " + members[1]);  //debug 
    console.log(mem + " " + mem[0] + " " + mem[1] + " " + mem[2] + " " + mem[3] + " " + mem[4]);  //debug 

    } 

получить список журналов, повторяющий:

1333 1 8000,current,2014-01-01,Ms,Joe,Soap 
0 0 undefined undefined undefined undefined 
1333 1 8000,current,2014-01-01,Ms,Joe,Soap 
1 1 undefined undefined undefined undefined 
1333 1 8000,current,2014-01-01,Ms,Joe,Soap 
2 2 undefined undefined undefined undefined 
1333 1 8000,current,2014-01-01,Ms,Joe,Soap 
3 3 undefined undefined undefined undefined 
1333 1 8000,current,2014-01-01,Ms,Joe,Soap 
4 4 undefined undefined undefined undefined 
1333 1 8000,current,2014-01-01,Ms,Joe,Soap 
5 5 undefined undefined undefined undefined 
1333 1 8000,current,2014-01-01,Ms,Joe,Soap 
6 6 undefined undefined undefined undefined 
1333 1 8000,current,2014-01-01,Ms,Joe,Soap 
7 7 undefined undefined undefined undefined 
1333 1 8000,current,2014-01-01,Ms,Joe,Soap 
8 8 undefined undefined undefined undefined 
1333 1 8000,current,2014-01-01,Ms,Joe,Soap 
9 9 undefined undefined undefined undefined 
1333 1 8000,current,2014-01-01,Ms,Joe,Soap 
10 1 0 undefined undefined undefined 
1333 1 8000,current,2014-01-01,Ms,Joe,Soap 
11 1 1 undefined undefined undefined 
1333 1 8000,current,2014-01-01,Ms,Joe,Soap 
12 1 2 undefined undefined undefined 

где 1333 является числом массивы в массиве элементов. Joe Soap является последним участником в списке. Почему console.log (mem); производит прирост числа, о котором я понятия не имею. Еще одна особенность происходит, когда это число идет двойной цифрой, например. 12 делает mem [0] = 1 и mem [1] = 2 !! Остальные элементы mem «не определены».

Просто для полноты картины, вот весь сценарий:

<?php 
/***** php and javascript to administer member details *****/ 

// **** get entire members table into a variable 
    global $wpdb; 
    $query="SELECT * FROM wp_ta_members"; 
    $member_table=$wpdb->get_results($query); 
    echo "<p>Size of wp_ta_members table is " . count($member_table) . "</p>"; //debug 
?> 
<script type="text/javascript"> 
    var members = [2000]; 
    var tempary = []; 
    var a1 = ["100", "scooby", "doo"];  //test 
    var a2 = ["200", "soup", "dragon"];  //test 
    var a3 = [];  //test 
    a3.push(a1);  //test 
    a3.push(a2);  //test 
    console.log(a3); 
    console.log(a3[0]); 
    console.log(a3[1]); 
    console.log(a3[1][0] + " " + a3[1][1]); 
<?php 
    foreach ($member_table as $member_row) 
     { 
     $tmpary=array($member_row->member_id, 
     ($member_row->current==1)?"current":"not a member", 
     $member_row->date_joined, 
     $member_row->title, 
     $member_row->first_names, 
     $member_row->last_names); 
     $x = 0; 
     foreach($tmpary as $value){ 
      echo 'tempary[' . $x . '] = "' . $value . '";'; 
      $x++; 
      } 
?> 
//  tempary=JSON.parse("<?php echo json_encode($tmpary); ?>"); 
     document.write(tempary[4] +"<br />");  //debug 
     console.log(tempary);   //debug 
     members.push(tempary); 
<?php  } 
?> 
    document.write(members + "<br />");  //debug 
    document.write("Hi Will again<br />");  //debug 
    for (mem in members) 
     { 
     console.log(members.length + " " + mem.length + " " + members[1]); //debug 
     console.log(mem + " " + mem[0] + " " + mem[1] + " " + mem[2] + " " + mem[3] + " " + mem[4]); //debug 

     } 
</script> 

Я боролся с этим в течение нескольких дней, и теперь иссякают идеи. Любая помощь будет принята с благодарностью.

+0

Я бы предположил, что вы поместили значения массива в элементы html, затем вызовите эти элементы в JS и сохраните их в массиве. – hzjw

+1

Вы пытались 'console.log (tempary)'? Каковы его результаты? Кроме того, вы написали '$ tmpary' как переменную PHP. Возможно, это опечатка. – kernel

+0

[JSON.parse()] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse)? – Novocaine

ответ

0

Используйте цикл Еогеасп и написать код JS на каждой итерации после объявления массива JS:

<script> 

var js_array = new Array(); 

<?php 

    $x = 0; 

    foreach($item as $key => $value){ 

     echo 'js_array[$x] = "' . $value . '";'; 

     $x++; 
    } 

?> 

</script> 
+0

' ' – SgtSunshine

+0

Мне пришлось изменить ваш код на:' 'Но это все еще не работает. – SgtSunshine

1

Я вижу, что вы переписав tempary массива на каждой итерации. Итак, к тому времени, когда вы json_encode, вы останетесь с последним элементом.

Попробуйте вместо этого:

global $wpdb; 
$query="SELECT * FROM wp_ta_members"; 
$member_table=$wpdb->get_results($query); 
echo "<p>Size of wp_ta_members table is " . count($member_table) . "</p>";  //debug 
?> 
<script type="text/javascript"> 
<?php 
$members = array(); 
foreach ($member_table as $member_row){ 
    $member = array(
     $member_row->member_id, 
     ($member_row->current==1)?"current":"not a member", 
     $member_row->date_joined, 
     $member_row->title, 
     $member_row->first_names, 
     $member_row->last_names 
    ); 
    $members[] = $member; 
} 
?> 
var members = <?php echo json_encode($members) ?>; 
</script> 
<?php } 
?> 
+0

Спасибо за помощь. Вы правы, что я использую перезапись tempary на каждой итерации, но я также использую members.push(), чтобы каждый раз добавлять содержимое tempary членам, чтобы я мог повторно использовать tempary. Однако я попробую ваше решение. – SgtSunshine

+0

Спасибо killneel. Тем не менее, я хочу получить массив массивов. То есть члены [] - это массив массивов member []. Вышеприведенное не похоже на это. – SgtSunshine

+0

Мой ответ на самом деле создает многомерный массив (массив массивов-членов) в php и затем выводит строку json этого массива php. Вы можете видеть, что на каждой итерации цикла foreach $ member инициализируется и заполняется значениями из строки таблицы. Затем этот массив помещается в массив элементов, так что в конце члены должны представлять собой числовой индексный массив с каждым элементом в нем, состоящим из массива. – dnshio

1

я обнаружил, где лежала моя проблема. Особенно killneel, который придумал очень элегантное решение проблемы 2D-массива. Оказалось, что суть проблемы в том, как я обращался к массиву. Просто для ссылки НИКОГДА пользовательский цикл for..in обрабатывает массив! Это гораздо лучше использовать:

var len = arr.length; 
for (var i=0; i<len; i++) { 
    console.log(arr[0];  // or whatever you want to do with the array element 
    } 
+0

вы можете продвинуться после [вы получаете 15 реп] (http://stackoverflow.com/help/privileges/vote-up) –

Смежные вопросы