Przepisanie kodu z php na javascript

0

Jak przepisać ten kod na javascript?

$tablica = array();
$tablica[] = array('nazwa1' => 'wartosc1', 'nazwa2' => 'wartosc2', 'nazwa3' => 'wartosc3');
$tablica[] = array('nazwa1' => 'wartosc1111', 'nazwa2' => 'wartosc2222', 'nazwa3' => 'wartosc3333');

print_r($tablica).'<br /><br />';

// wywołanie konkretnej wartosci tablicy
echo $tablica[0]['nazwa2'].'<br />';
echo $tablica[1]['nazwa3'].'<br /><br />';

foreach ($tablica as $klucz => $wartosc)
{
	jakasFunkacja($wartosc['nazwa1'], $wartosc['nazwa2'], $wartosc['nazwa3']);
}
0

a czego konkretnie nie umiesz zrobić?

0

Javascript nie ma chyba foreach i nie wiem jak to przerobić na javascript.

0

Dlaczego nie działa?

files = array();
files[] = {'id': '1111', 'filename': 'Jakas nazwa', 'full_filesize': '104249426'};
files[] = {'id': '22', 'filename': '33', 'full_filesize': '44'};

for(var i in files)
{
    alert(files[i][id]);
}
0

W JavaScripcie nie ma takiej konstrukcji jak tablica[] = cośtam.

Tablice obiektów deklaruje się tak (zauważ, jak bardziej kompaktowa jest to składnia w porównaniu z PHP):

var tablica = [
  // pierwszy obiekt:
  {
    str: "abc",
    num: 1
  },
  {
    str: "def",
    num: 2
  }
];

Powyższy kod sprawi, że w zmiennej tablica będzie tablica dwóch obiektów. Każdy z nich posiada własność str oraz num.

Jeśli chcesz się iterować po tablicy, NIE używaj for..in. Ta konstrukcja nie do tego służy! Użyj zwykłej pętli for z licznikiem. Długość tablicy odczytasz z tablica.length.

W nowszych środowiskach wykonawczych, np. nowszych przeglądarkach, mógłbyś użyć metody tablica.forEach(), ale nie ma potrzeby korzystania z tego.

0

@bswierczynski:
Nie rozpisałeś się! Dlaczego nie stosować for..in? :D

0

Więc zrobiłem tak:

var files = {'id': '1111', 'filename': 'Jakas nazwa', 'full_filesize': '104249426'}, {'id': '22', 'filename': '33', 'full_filesize': '44'};

for(var i in files)
{
    alert(files[i][id]);
}

Proszę o kod na przykładzie php. Sorry, że o takie banały pytam ale nie znam nawet podstaw javascript, a potrzebuję to zrobić.

0

m.in dlatego że to wolniejsze i robi się nieciekawie gdy zaczniesz używać prototypów

brawo, bswierczynski że pierwszy raz się powstrzymałeś przed przepisaniem rozdziału książki do posta <brawo> ;D

1

@Wibowit:
for..in służy do iterowania się po własnościach obiektu. Iteruje po wszystkich "iterowalnych" (enumerable) własnościach obiektu, własnych lub odziedziczonych. Tablice, oprócz własności będących indeksami, mają też własność .length, ale ona nie jest enumerable, więc w for..in by nie wyszła.

Jeśli jednak ktoś nieopatrznie dodałby coś do prototypu tablic, np. funkcję .isEmpty(), bo chciałby mieć taką funkcję we wszystkich tablicach...

// uwaga, zły kod! (pod wieloma względami)
Array.prototype.isEmpty = function() {
  return this.length === 0;
};

To w naszym for..in po dowolnej tablicy dostalibyśmy już, oprócz indeksów, również ciąg isEmpty. Bo funkcja isEmpty dodana w ten sposób jest enumerable. Rozszerzanie prototypów obiektów wbudowanych nie jest najlepszym pomysłem, ale nawet niektóre biblioteki tak robią.

Poza tym, for..in nie gwarantuje kolejności odwiedzania elementów.

Zwykle jednak przyfarcimy i elementy będą odwiedzane w kolejności dodania, a w tablicy zdefiniujemy je wszystkie naraz, więc kolejność będzie właściwa. Co więcej, nikt nie powinien rozszerzyć Array.prototype ani nadrzędnego Object.prototype, więc wszystko może nam niby zadziałać. Ale gdy np. usuniemy jakąś wartość z tablicy, a potem ją dodamy, IE może się już zgubić jeśli chodzi o kolejność iteracji.

for..in używa się do iterowania po wszystkich własnościach obiektu. Zwykle chodzi nam o własności, których nazwy nie są liczbami (indeksami). Często przydaje się to w tzw. refleksji. I najczęściej trzeba użyć .hasOwnProperty() by uchronić się przed iterowaniem się przez własności odziedziczone z łańcuchu prototypów.

0

Nie wiem dlaczego nie chce działać. Powinno wysłać zapytanie GET'em do pliku filesize.php, który zwraca wartość liczbową. Nastepnie powinno to info wyświetlać w div'ie o odpowiednim id.

<script type="text/javascript" language="javascript">
	function sprawdz() {

	for (var klucz in files)
			sprawdz2(files[klucz]["id"], files[klucz]["filename"], files[klucz]["full_filesize"]);
	}

	function sprawdz2(file_id, filename, full_filesize) {
	advAJAX.get({
	url: "filesize.php?filename=" + file_id + "&full_filesize" + full_filesize,
			onSuccess : function(obj) {
			wiadomosc = parseInt(obj.responseText);
			var licznik = document.getElementById(file_id);
			if (wiadomosc >= 100) {
					licznik.innerHTML = "100%";
			} else {
					licznik.innerHTML = wiadomosc + "%";
			}
			if (wiadomosc >= 100) {
					document.location="index.php";
			}
			alert(wiadomosc);
	}
	});
	}
	
	
	var files = [
		{'id': '1349540', 'filename': 'Jakas nazwa 2', 'full_filesize': '104249426'}, 
		{'id': '44646', 'filename': 'Jakas nazwa 3', 'full_filesize': '104249426'}
	];
	setInterval ( "sprawdz()", 1000 );
	
	
</script>



<div id="1349540"></div>
<div id="44646"></div>
0

Wiem, już co jest przyczyną wywalania błędu NaN%.

Jak do pliku check_procent.php wrzucą same dane typu 100;1336927028;domena.pl;1 to działa. A jak wykonam w php i dam echo "100;1336927028;domena.pl;1" to wywala NaN%
Przecież tak samo zwraca dane więc w czym jest problem? Długością wykonywania skryptu o kilka ms ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1