2018-12-28, 17:48
  #1
Medlem
Hej,

Jag försöker få in data till en betallösning. Detta görs via en array som ser ut här:
[PHP]
$postData = array(
"Articles" => array(
array(
"ArticleName" => "testprodukt 1",
"ArticleNumber"=>"1",
"Description"=>"testar denna produkt",
"Price"=>"17500",
"Quantity"=>"100",
"VAT"=>"2500",
),
array(
"ArticleName" => "Frakt",
"ArticleNumber"=>"1",
"Description"=>"Fraktkostnad",
"Price"=>$_SESSION['shippingCost']*100,
"Quantity"=>"100",
"VAT"=>"2500",
),
)
);
[/PHP]

Idag så lagras det kunden har valt i en session där koden ser ut enligt följande:
[PHP]
if(!empty($_SESSION['jsonpost'])) {
//print $_SESSION['jsonpost'];
$json = json_decode($_SESSION['jsonpost'], true);
} else {
$json = [];
}
[/PHP]

Hur ska jag gå tillväga för att loopa igenom sessionen och få ut en Articles-array av detta som jag sedan kan använda i $postData-arrayen? Jag har försökt en hel del olika saker men lyckas inte få till detta.

Tack på förhand!
Citera
2018-12-28, 18:28
  #2
Medlem
[PHP]
foreach($postData as $datas) :
foreach($datas as $data ) :
echo $data['ArticleName'];
echo $data['ArticleNumber'];
echo $data['Description'];
...
...
...
osv
endforeach;
endforeach;

[/PHP]
Citera
2018-12-29, 00:41
  #3
Medlem
Tack, men detta måste ju komma inom:
[PHP]
"Articles" => array(

);
[/PHP]

Och så som jag förstått det och läst mig till så går det ju inte att ha en foreach inom en array? Så hur ska jag få in detta inom den arrayen?
Citera
2018-12-29, 09:11
  #4
Medlem
Citat:
Ursprungligen postat av Kakan1137
Tack, men detta måste ju komma inom:
[PHP]
"Articles" => array(

);
[/PHP]

Och så som jag förstått det och läst mig till så går det ju inte att ha en foreach inom en array? Så hur ska jag få in detta inom den arrayen?

Jag är lite osäker på vad du försöker åstadkomma och hur, men om jag har förstått dig rätt vill du tilldela arrayn $postData de nya värdena av $json som är en JSON-representation av samma variabel som ska läggas till.

Du lägger till element till en array genom att använda
[php]
$array[] = $elementsomskaläggastill;
[/php]

Lek gärna med att definiera olika arrayer mot slutet, som $postData[], $postData['Articles'], $postData['Articles'][], och lägg märke till skillnaderna om var ditt data stoppas in i arrayn.


Om du loopar igenom $json['Articles'] och lägger till varje nyckel till den befintliga $postData['Articles']-arrayn borde du åstadkomma vad du vill göra, dvs att lägga till en ny artikel utifrån JSON-formaterad data till $postData-variabeln. Det viktiga här jämfört med din kod är foreach-loopen mot slutet. Som du själv är inne på kan du inte använda foreach inuti en variabel-/array-deklaration, men det är inte vad du vill göra. Du vill ha variabeln (JSON-strängen) och därefter decode:a den och lägga till den i din befintliga array.

[php]<?php

session_start();
// Initialisera shippingCost eftersom den inte är deklarerad annars
$_SESSION['shippingCost'] = 10;

$postData = array(
"Articles" => array(
array(
"ArticleName" => "testprodukt 1",
"ArticleNumber"=>"1",
"Description"=>"testar denna produkt",
"Price"=>"17500",
"Quantity"=>"100",
"VAT"=>"2500",
),
array(
"ArticleName" => "Frakt",
"ArticleNumber"=>"1",
"Description"=>"Fraktkostnad",
"Price"=>$_SESSION['shippingCost']*100,
"Quantity"=>"100",
"VAT"=>"2500",
),
)
);

// Vårt input-data, samma layout som befintlig array
$inputData = array(
"Articles" => array(
array(
"ArticleName" => "testprodukt 2",
"ArticleNumber"=>"2",
"Description"=>"testar denna produkt också",
"Price"=>"17500",
"Quantity"=>"100",
"VAT"=>"2500",
),
array(
"ArticleName" => "Frakt",
"ArticleNumber"=>"2",
"Description"=>"Fraktkostnad",
"Price"=>$_SESSION['shippingCost']*100,
"Quantity"=>"100",
"VAT"=>"2500",
),
),
);

echo "Värdet av \$postData är: <br>";
echo "<pre>";
print_r($postData);
echo "</pre>";
echo "<hr>";

// Lek att vi får $inputData som en JSON-encoded string
$jsoninput = json_encode($inputData);
// Deklarera JSON-encoded string som en normal array i PHP
$json = json_decode($jsoninput, true);


echo "Värdet av \$inputData är: <br>";
echo "<pre>";
print_r($inputData);
echo "</pre>";
echo "<hr>";

echo "Värdet av \$postData efter att JSON-produkt lagts till är: <br>";
foreach($json['Articles'] as $jsonartikel) {
$postData['Articles'][] = $jsonartikel;
}

echo "<pre>";
print_r($postData);
echo "</pre>";
echo "<hr>";

?>[/php]
Citera
2018-12-29, 09:11
  #5
Medlem
Citat:
Ursprungligen postat av Kakan1137
Tack, men detta måste ju komma inom:
[PHP]
"Articles" => array(

);
[/PHP]

Och så som jag förstått det och läst mig till så går det ju inte att ha en foreach inom en array? Så hur ska jag få in detta inom den arrayen?
Nästan all form av programmering bygger på att man kan "sätta ihop" saker, tex att man kan sätta en array inne i en annan array.
All vettigt programmering bygger bygger på detta sätt..

(Och NEJ det finns regel som säger att man inte kan ändra / loopa / ta bort saker / normal array operation / från en array om den finns inne i en annan)

Det skulle bryta mot principen om "namn givning" och skulle paja eller försvåra programmering ENORMT.. IE du har en array
=> Vilka saker kan man göra med en array.
=> Dessa saker kan man då göra med ALLA array:er...
Tex:
  • Om de finns inne i en array eller ej
  • om de är en global variabel eller ej
  • om de kommer från JSON eller ej
  • om de kommer från en användare eller ej
  • om de är argument till en funktion eller en variabel

Inom programmering, så brukar det gälla "namn givning // type" IE om du har en array så kan du göra alla array saker som går att göra på alla array'er.
Annars har du INTE en "Array" då har du något som vi nom programmering kanske skulle kalla en "array liknande", men vi skulle inte kalla det för en array.

Visst jag har sett något situation där man ibland har haft en "array liknande" sak, men inte i PHP
(Javascript, där man får ett array liknande "objekt" från window.document.getElementsByTagName .. den saknar bla. map)
Citera
2018-12-29, 12:17
  #6
Medlem
Jag har nästan lyckats med det jag vill skapa nu, bara ett litet problem kvar.

[PHP]
$json = json_decode($_SESSION['jsonpost'], true);
} else {
$json = [];
}

foreach ($json as $data) {
$products = array(
"ArticleName" => $data['name'],
"ArticleNumber"=> $data['id'],
"Description"=> '',
"Price"=>$data['price']*100,
"Quantity"=>$data['qty']*100,
"VAT"=>"2500",
);
}

print_r($products);
[/PHP]

Denna foreach som ska skapa upp products-arrayen visar bara den produkten man lade i varukorgen senast och verkar inte loopa igen. Vad har jag gjort för fel? Kan inte direkt se något fel.

Arrayen "Products" måste man kunna komma åt utanför loopen eftersom denna ska in såhär längre ner i koden:

[PHP]
$postData = array(
"Postcode" => "12345",
"Currency" => "SEK",
"Articles" => array(
array(
"ArticleName" => "Frakt",
"ArticleNumber"=>"1",
"Description"=>"Fraktkostnad",
"Price"=>$_SESSION['shippingCost']*100,
"Quantity"=>"100",
"VAT"=>"2500",
),
$products
)
);
[/PHP]

Så för varje produkt som man lagt i varukoden så ska en ny array skapas upp. Men nu skapar den bara upp den sista produkten som jag lagt till och visar inte de andra produkterna i arrayen.
__________________
Senast redigerad av Kakan1137 2018-12-29 kl. 12:20.
Citera
2018-12-29, 12:40
  #7
Medlem
Citat:
Ursprungligen postat av Kakan1137
Jag har nästan lyckats med det jag vill skapa nu, bara ett litet problem kvar.

[PHP]
$json = json_decode($_SESSION['jsonpost'], true);
} else {
$json = [];
}

foreach ($json as $data) {
$products = array(
"ArticleName" => $data['name'],
"ArticleNumber"=> $data['id'],
"Description"=> '',
"Price"=>$data['price']*100,
"Quantity"=>$data['qty']*100,
"VAT"=>"2500",
);
}

print_r($products);
[/PHP]

Denna foreach som ska skapa upp products-arrayen visar bara den produkten man lade i varukorgen senast och verkar inte loopa igen. Vad har jag gjort för fel? Kan inte direkt se något fel.

Din kod skapar $products-arrayn för varje element i $json-foreachloopen. Det vill du inte göra, eftersom den då bara kommer skapas en gång. Pusha datat till arrayn istället, se mitt tidigare inlägg.
Citera
2018-12-29, 12:50
  #8
Medlem
Citat:
Ursprungligen postat av Regentia
Din kod skapar $products-arrayn för varje element i $json-foreachloopen. Det vill du inte göra, eftersom den då bara kommer skapas en gång. Pusha datat till arrayn istället, se mitt tidigare inlägg.

Jo jag försökte det med:
[PHP]
foreach ($json as $data) {
$data['qty'] = $data['qty']*100;
$data['price'] = $data['price']*100;
$postData['Articles'][] = $data;
}
[/PHP]

Men då får jag inte arrayen att se ut enligt följande struktur.:
[PHP]
array(
"ArticleName" => "Frakt",
"ArticleNumber"=>"1",
"Description"=>"Fraktkostnad",
"Price"=>$_SESSION['shippingCost']*100,
"Quantity"=>"100",
"VAT"=>"2500",
),
[/PHP]

Och detta ger tillbaka fel för min del.
Citera
2018-12-29, 13:00
  #9
Medlem
Nu fick jag till det! Tack för hjälpen!
Citera
2019-01-02, 02:29
  #10
Medlem
Citat:
Ursprungligen postat av Kakan1137
Nu fick jag till det! Tack för hjälpen!
Berätta gärna hur du gjorde, och/eller visa koden, det bidrar till forumet
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in