• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Brak wartości w tablicy PHP ?

Object Storage Arubacloud
+1 głos
209 wizyt
pytanie zadane 13 listopada 2021 w PHP przez Silent7 Nowicjusz (160 p.)

Potrzebuję wykonać małą tabelkę przeliczającą wszystkie pozycje z Faktury VAT wg stawek VAT. To jest ta mała tabelka na zdjęciu. Z tym że w tym przykładzie mamy tylko produkty z jedą 23 % stawką.

Napisałem kod ale nie działa on dla pewnego zestawu danych. Czy ktoś może mi wytłumaczyć dlaczego kompilator nie widzi wartości tablicy mimo iż w poprzednim kroku wartość ta została przypisana co widać przy wyświetlaniu jej na ekran? Otrzymuje wtedy coś takiego: Warning: Undefined array key 1 in D:\PROGRAMY\XAMPP\htdocs\faktury\test2.php on line 75

<?php
// Definicja przykładowych tablic do testów
$formVat[] = array();
$formWart[] = array();

// Uzupełnienie tablic przykładowymi danymi
$formVat[0] = 23; $formWart[0] =     2;
$formVat[1] =  3; $formWart[1] =     5;
$formVat[2] =  3; $formWart[2] =   100;

// Ustawienie liczników indeksów tablic
$stawkaVat = 0;
$sumaVat = 0;

// Definicja drugiej tablicy z wyszczególnymi pozycjami VAT

$tablica[$stawkaVat][$sumaVat]= array();

// Początkowe uzupełnienie drugiej tablicy pierwszym wierszem z przykładowej tablicy
$tablica[$stawkaVat][$sumaVat] = $formVat[0];
$tablica[$stawkaVat][$sumaVat+1] = $formWart[0];

// Flaga oznaczająca czy dodać nową stawkę VAT czy nie
$flaga = true;

// Pętle
for($lp = 1; $lp < count($formVat); $lp++) {
	
	for($stawkaVat=0; $stawkaVat < count($tablica); $stawkaVat++) {
		
		// Wipsanie na ekran zmiennych z każdego kroku:
		echo "---------------------<br/>";
		echo "lp:";
		 print_r($lp);
		echo "<br/> if(";
		 print_r($stawkaVat);
		echo " < ";
		 print_r(count($tablica));
		echo ")<br/> SumaVat:";
		print_r($sumaVat);
		echo "<br/>";
		echo "formVat[$lp] == tablica[$stawkaVat][$sumaVat]";
		echo "<br/>";
		print_r($formVat[$lp]);
		echo " - ";
		print_r($tablica[$stawkaVat][$sumaVat]); // Wartości tej tablicy nie chce mi znaleźć tablica[1][0]
		echo "<br/>";



		// Wyświetlenie Całej tablicy
		echo "Pełna Tablica:";
		echo "<br/>";
		foreach($tablica as $key => $number) {
		//print_r($key);
		//echo "-";
		print_r($number);
		echo "<br/>";

	
	}
		// Sprawdzamy czy aktualnie sprawdzana stawka już jest w naszym sumowaniu
		// Jeśli jest to dodajemy do niej wartość
		if ($formVat[$lp] == $tablica[$stawkaVat][$sumaVat]) {
			$tablica[$stawkaVat][$sumaVat+1] = $tablica[$stawkaVat][$sumaVat+1] + $formWart[$lp];
			$flaga = false;
			break;
		}
		
	}
	// Jeśli stawka nie została znaleziona wcześniej w istniejącej tablicy dodajemy 
	// ją na końcu i przypisujmey odpowiadającą jej wartość
	if ($flaga == true) {
			
		$tablica[$stawkaVat + 1][$sumaVat] = $formVat[$lp];
		$tablica[$stawkaVat + 1][$sumaVat+1] = $formWart[$lp];
		$flaga = true;
	}

		
}	

?>

 

2 odpowiedzi

0 głosów
odpowiedź 14 listopada 2021 przez VBService Ekspert (252,740 p.)
wybrane 14 listopada 2021 przez Silent7
 
Najlepsza

Może spróbuj użyć zamiast kilku tablic np.: tablicę asocjacyjną.

 

przykład

<?php
	$products = [
		[
			'name' => 'Produkt1',
			'quantity' => 0,
			'price'    => 0,
			'discount' => 0,
			'vat_rate' => 0
		],
		[
			'name' => 'Produkt2',
			'quantity' => 0,
			'price'    => 0,
			'discount' => 0,
			'vat_rate' => 0
		],
		[
			'name' => 'Produkt3',
			'quantity' => 0,
			'price'    => 0,
			'discount' => 0,
			'vat_rate' => 0
		],
		[
			'name' => 'Produkt4',
			'quantity' => 0,
			'price'    => 0,
			'discount' => 0,
			'vat_rate' => 0
		],
		[
			'name' => 'Produkt5',
			'quantity' => 0,
			'price'    => 0,
			'discount' => 0,
			'vat_rate' => 0
		]       
	];

	// Wypełnianie losowymi danymi
	$pennies_arr  = [0, 10, 30, 50, 70, 99];
	$discount_arr = [0, 5, 0, 10, 0, 15, 0, 20];
	$vat_rate_arr = [0, 5, 8, 23];

	foreach ($products as &$row) {
		$row['quantity'] = rand(1, 5);
        $row['price']    = number_format((rand(10, 150).'.'.$pennies_arr[array_rand($pennies_arr)]), 2);
        $row['discount'] = number_format($discount_arr[array_rand($discount_arr)]);
        $row['vat_rate'] = number_format($vat_rate_arr[array_rand($vat_rate_arr)]);
	}
 
	unset($row);   

	// Generowanie wierszy do tablicy
	$summary = [];
	$rows = '';

  foreach ($products as $key => $row) {
		$key++;
		$net_price_after_discount = $row['price'] - (($row['price'] / 100) * $row['discount']);
		               $net_price = $net_price_after_discount * $row['quantity'];
			           $vat_value = ($net_price / 100) * $row['vat_rate'];
			         $gross_price = $net_price + $vat_value;

		$rows .= '<tr>'
               . "<td>{$key}.</td>"
               . "<td>{$row['name']}</td>"
               . "<td>{$row['quantity']}</td>"
               . "<td>{$row['price']}</td>"
               . "<td>{$row['discount']}</td>"
               . '<td>'.number_format($net_price_after_discount, 2).'</td>'
               . "<td>{$row['vat_rate']}</td>"
               . '<td>'.number_format($net_price, 2).'</td>'
               . '<td>'.number_format($vat_value, 2).'</td>'
               . '<td>'.number_format($gross_price, 2).'</td>'
               . '</tr>';

		if (! isset($summary[$row['vat_rate']])){
			$summary += [$row['vat_rate'] => [$net_price, $vat_value, $gross_price]];
		} else {
			$summary[$row['vat_rate']][0] += $net_price;
			$summary[$row['vat_rate']][1] += $vat_value;
			$summary[$row['vat_rate']][2] += $gross_price;
		}
	}

    // var_dump($summary);

	// Generowanie wierszy do tablicy summary
	$net_price_total = $vat_value_total = $gross_price_total = 0;
	ksort($summary, SORT_NUMERIC);
	$rows_summary = '';

	foreach ($summary as $key => $row) {
		$net_price_total += $row[0];
		$vat_value_total += $row[1];
		$gross_price_total += $row[2];
					 
		$rows_summary .= '<tr>'
					   . "<td>{$key}%</td>"
					   . '<td>'.number_format($row[0], 2).'</td>'
					   . '<td>'.number_format($row[1], 2).'</td>'
				       . '<td>'.number_format($row[2], 2).'</td>'                      
					   . '</tr>';
	}

	$summary_foot = '<td>'.number_format($net_price_total, 2).'</td>'
                  . '<td>'.number_format($vat_value_total, 2).'</td>'
                  . '<td class="to_pay">'.number_format($gross_price_total, 2).'</td>';
?>
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
 
    <style>
      .container {
        width: 800px;
      }

      table {
        box-sizing: border-box;
        width: 100%;                
        border-spacing: 0;
        border-collapse: separate;
      }
      th, td {
        border: 1px solid white;
      }
      thead tr {
        background-color: rgba(0,0,0,0.7);
        color: white;
      }
      th {
        font: 900 1.05em/1.6 monospace;
        padding: 0 0.25em;
      }
      th.vat {
        padding: 0 0.35em;
      }
      th.name {
        width: 30%;
      }
      tbody tr {
        transition: background-color 0.5s;
      }
      tbody tr:nth-child(odd) {
        background-color: rgba(0,0,0,0.1);
      }
      tbody tr:nth-child(even) {
        background-color: rgba(0,0,0,0.2);
      }
      tbody tr:hover {
        background-color: rgba(0,0,0,0.4);
      }         
      td {
        font: 400 1em/1.6 monospace;
        text-align: center;             
      }
			
      table.summary {
        width: 50%;
      }
      table.summary tfoot {
        background-color: rgba(0,0,0,0.6);              
      }
      table.summary tfoot td {
        font: 700 1.05em/1.55 monospace;
      }
      table.summary .to_pay {
        color: limegreen;
      }
    </style>
  </head>
  <body>
    <div class="container">
      <table>
        <thead>
          <tr>
            <th>Lp.</th>
            <th class="name">Nazwa towaru / usługi</th>
            <th>Ilość</th>
            <th>Cena netto</th>
            <th>Rabat %</th>
            <th>Cena netto po rabacie</th>
            <th>Stawka Vat</th>
            <th>Kwota netto</th>
            <th>Kwota Vat</th>
            <th>Kwota brutto</th>
          </tr>
        </thead>
        <tbody>
          <?php echo $rows; ?>
        </tbody>
      </table>
      <br />
      <table class="summary">
        <thead>
          <tr>
            <th>Stawka Vat</th>
            <th>Kwota netto</th>
            <th>Kwota Vat</th>
            <th>Kwota brutto</th>
          </tr>
        </thead>
        <tbody>
          <?php echo $rows_summary; ?>
        </tbody>
        <tfoot>
          <tr>
            <td>Razem</td>
            <?php echo $summary_foot; ?>
          </tr>
        </tfoot>              
      </table>
    </div>
  </body>
</html>

 

1
komentarz 14 listopada 2021 przez Silent7 Nowicjusz (160 p.)
Masz rację tablica asocjacyjna bardziej się nadaje do tego, będzie bardziej przejrzysta. W sumie wykonałeś większość roboty za mnie, pozostaje mi przerobić trochę i podpiąć to pod formularz, także dzięki. Ale dlaczego mi błąd wywaliło tam w moim kodzie dalej jestem ciekaw.
0 głosów
odpowiedź 13 listopada 2021 przez Michał Kazula Pasjonat (19,540 p.)
Moim skromnym zdaniem to $lp jest źle ustawiony, tablice masz od 0, a $lp zaczynasz od 1. Co skutkuje próbą odczytania wartości przez klucz którego nie ma w tablicy.
komentarz 14 listopada 2021 przez Silent7 Nowicjusz (160 p.)
Dzięki za odpowiedź.

$lp zaczynam od 1 bo przed dwoma pętlami przepisuje pierwszy wiersz z tablicy z produktami do drugiej tablicy ze stawkami VAT, ponieważ od tego zawsze zaczynać będzie się sumowanie wartości wg. stawek VAT i jednocześnie nie ma potrzeby sprawdzać 0-rowego wiersza pierwszej tabeli. Poza tym offset byłby wtedy gdyby sprawdzany byłby indeks tabeli większy od liczby wierszy w tabeli (warunek jest ustawiony prawidłowo), a ustawienie od którego wiersza chcę sprawdzać tabele jest dowolne. Następna rzecz, jak uruchomię program to widać na ekranie, że tabla jest uzupełniona wartością krok przed próbą dostępu do newralgicznego elementu. Dlatego mnie to dziwi. Kolejna dziwna rzecz dla innego zestawu danych program nie wyrzuca błędów.

Podobne pytania

0 głosów
1 odpowiedź 123 wizyt
pytanie zadane 5 czerwca 2017 w PHP przez Alterwar Dyskutant (7,650 p.)
0 głosów
1 odpowiedź 215 wizyt
pytanie zadane 30 września 2015 w PHP przez Matteo Nowicjusz (190 p.)
0 głosów
0 odpowiedzi 70 wizyt
pytanie zadane 9 marca 2023 w JavaScript przez ferdynand Obywatel (1,250 p.)

92,554 zapytań

141,399 odpowiedzi

319,535 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...