Jump to content
Maihes

php array

Recommended Posts

<?php
$val1 = "10";
$val2 = "20";
$val3 = "30";
$prod = "2";

$array1=array("1" => $val1, "2"=> $val2, "3" => $val3);
if (in_array($prod,$array1))
{
foreach ($array1 as $result) {
     $bla = $result;
     echo  $bla;
    
}
} 
else
{
    $bla = 0;
echo $bla;
}
?>

ok so i have this kind of array or at least i need something like this but this returns 0 so if i could get help with this i would really appreciate and i hope i posted this in the right place.

Share this post


Link to post
Share on other sites

well if i change in_array part to what you gave me i get as result back 102030 which is obviously not what i need, but thanks for reply anyway .  

Share this post


Link to post
Share on other sites

Your code was

if $prod is in the array
    loop through the array and output each value
endif

As your values are 10, 20 and 30 then the output of "102030" is doing exactly what you asked it to do.

Why don't you tell us what you need - we aren't psychics.

Share this post


Link to post
Share on other sites

ok sorry about that .. i wrote a new code which is working fine with a small issue

<?php
$array = array(
$TSprice => 1,
$ESSprice => 2,
$ASBBprice => 3,
$MSBBprice => 4,
$KAprice => 5,
$CFSprice => 6,
$BKprice => 7,
$ODPprice => 8,
$GTDPprice => 9,
$GSDPprice => 10,
$SLGHprice => 11,
$RCBprice => 12,
$RCCBprice => 13,
$CCBprice => 14,
$STORprice => 15,
$CPCprice => 16,
$PPPCprice => 17,
$PPCprice => 18,
$APCprice => 19,
$MDFCprice => 20,
$SDFCprice => 21,
$MTDFCprice => 22,
$DSFCprice => 23
);

    while ($testvalue = current($array)) {
      if ($testvalue == $prodval) {
        $proprice = key($array);
            } 
          next($array);
    
        }
?>

ok so this works fine the only problem is that if some of the prices are the same then my result won't show up for all prices just for one.

for example as you can see the variables for prices .. each correspond to 1 product which this array is giving me once i select a product from the drop down list.

but if for example $TSprice = 10 and $ESSprice = 10 .. when i select TS from drop down $proprice gives me the right value (10) but then if i select ESS it doesnt give me any value only if i change the price for ESS so it doesnt match any of the other prices. So i need to make sure that it gives me the price even if other product has the same price 

Share this post


Link to post
Share on other sites

Array keys need to be unique. Build your array the other way round

$array = [  1 => $TSPrice,
            2 => $ESSPrice,

            etc

         ];

the it doesn't matter if two prices are the same.

Share this post


Link to post
Share on other sites

and how do i do that i mean:

    while ($testvalue = current($array)) {      

if ($testvalue == $prodval) {         

$proprice = key($array);            

}           

next($array);              

}

this part ... because i'm kinda noob with arrays coz if i simply just change the other way around its not working since i think $prodval looks in the value and not key

Share this post


Link to post
Share on other sites

We still don't know what you are trying to do. All you've told us is how you are attempting to do something.

  • Where are the prices stored
  • Why do need to hard code them into an array
  • What does the dropdown look like - you mentioned selecting a product. (Does that give you the 1, 2, or 3 or the price)
  • Are you trying to find the price for a product or trying to find all products that have a specific price.

Give us a clue and we can help.

Share this post


Link to post
Share on other sites

So i have a dropdown with a list of products $prodval is the variable that once i select a product from the list returns the products ID(which is populated from DB)

prices are stored in db too but each have an assigned variable as you could see in the array, so im trying to make the array that once i select a product from the list i get a variable which is = to the selected products price because based on the product's price i need to display certain info on the pace once the product is selected so i need the price for some of information there

Share this post


Link to post
Share on other sites
20 minutes ago, Maihes said:

prices are stored in db too but each have an assigned variable

That is not what you should be doing.

You should either

  • create a prices array direct from the DB where the keys are the product ids and values are the prices, or
  • When user selects product id, query the DB to get the price for the product

 

If your data looks like

+---------------+----------+
|  product_id   |  price   |
+---------------+----------+ 
|       1       |  10.00   |
|       2       |  12.50   |
|       3       |  10.00   |
+---------------+----------+

get the data and store in aray

$res = $db->query("SELECT product_id, price FROM product");
foreach ($res as $rec) {
    $prices[ $rec['product_id'] ] = $rec['price'];
}

then the array will be

$prices = [ 1 => 10.00,
            2 => 12.50,
            3 => 10.00     ]; 

and to get the price

$selected_id = 2;

$price = $prices[$selected_id];       //--> 12.50

 

Edited by Barand

Share this post


Link to post
Share on other sites

well the problem is that my prices DB looks like this:

ID,prod1,prod2,prod3,etc,
1 ,10   ,20   ,30   ,etc,

and is stored in a table , but then my products list which is stored in a different table looks like:

ID,Name
1,prod1
2,prod2
3,prod3
etc 

so it's a bit difficult to make it the way you said(i would have to change my db and parts of the codes i have in the project ... the array that i posted earlier works fine i just need to invert it like you said and look for the key and display the value instead of looking at value and display key

Share this post


Link to post
Share on other sites

Even with your terrible (polite description) table design it can still be done relatively easily without all those variables

 

I set up a couple of tables to replicate your DB

TABLE: product           TABLE: price
+----+-------+           +----+-------+-------+-------+
| id | name  |           | id | prod1 | prod2 | prod3 |
+----+-------+           +----+-------+-------+-------+
|  1 | prod1 |           |  1 | 10.00 | 20.00 | 30.00 |
|  2 | prod2 |           +----+-------+-------+-------+
|  3 | prod3 |
+----+-------+

code

const HOST     = 'localhost';                                                            
const USERNAME = '????';                                                                 
const PASSWORD = '????';                                                                 
const DATABASE = '????';                                                                
                                                                                         
function pdoConnect($dbname=DATABASE)                                                    
{                                                                                        
    $db = new PDO("mysql:host=".HOST.";dbname=$dbname;charset=utf8",USERNAME,PASSWORD);  
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);                        
    $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);                   
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);                                
    return $db;                                                                          
}                                                                                        

$db = pdoConnect();   

// create prices array with prod names as the keys
$res = $db->query("SELECT * FROM price");
$prices = $res->fetch(PDO::FETCH_ASSOC);

// create an array of prod names (key = prod id)
$res = $db->query("SELECT id, name FROM product");
foreach ($res as $r) {
    $prods[ $r['id'] ] = $r['name'];
}

$selected_id = 2;

$price = $prices[ $prods[$selected_id] ];

echo $price;                                 // 20.00

* * *

In future, all you would need to do is add a "price" column to your product table and put the prices in.

This will do it for you (use same connection code first)

<?php
          // CONNECTION CODE HERE //

$db->exec("ALTER TABLE `product` 
           ADD COLUMN `price` DECIMAL(10,2) NULL AFTER `name`");
           
$res = $db->query("SELECT * FROM price");
$prices = $res->fetch(PDO::FETCH_ASSOC);

$stmt = $db->prepare("UPDATE product
                      SET price = ?
                      WHERE name = ?
                     ");
                     
foreach ($prices as $name => $price) {
    $stmt->execute( [ $price, $name ] );
}

// JOB DONE - check the results...

$res = $db->query("SELECT id
                        , name
                        , price
                   FROM product     
                  ");
echo '<pre>';
foreach ($res as $r) {
    vprintf("%3d | %-20s | %10.2f\n", $r);
}

 

Edited by Barand

Share this post


Link to post
Share on other sites

wow that is a lot of code an i appreciate so much that you took your time to write it and help out,the thing is please check this out: my project <== this is the page with what i'm trying to do, it may give you a bit more insight ... the thing is that my price table has more items than the product one so not sure how is that a solution to integrate the prices into that table.. i thought about it too but since the prices table has more items .. wasn't sure how to proceed so i just made a table  for it(ik i could've make the table like: id,product,price .. but well at the time i just did it like that and stuck with it) .. well tbh atm for this project .. im using 4 different tables for that page (1 is for the prices on the left, 2 are for the drop down lists(1 for each) and 1 more which gets me: SS Req.; MS Req.:; SO Req.:; EO Req.:; Craft Cost:.) .. what i meant about the variables for the prices is that they are required anyway for them to be displayed so that's how i got them .. the thing is that i agree with you and not just my table .. i do feel that even my coding feels messy .. i think i have like 10-15 different php files(well not big files but like different functions for different parts of the page) for that one page .. haha :D  

Anyway, if you could be so kind as to check THIS out(its a .rar file containing all the files for that page) and let me know how messy it is and help me out fixing it i would really appreciate. (ofc when you have time to check it) any tips .. suggestions are so much appreciated

Edited by Maihes

Share this post


Link to post
Share on other sites

Do you think you could write your posts using some punctuation to make it easier to follow what you are saying?   Proper sentences would help tremendously instead of a run-on stream of text with no easy way to make sense of what you are trying to say.   A period here, a period there and some caps to start would be the thing to do.

Share this post


Link to post
Share on other sites

The solution should work for those products in the product table whose name matches a column name in the price table.

Basically you just need

            +----+-------+-------+
            | id | name  | price |
            +----+-------+-------+
            |  1 | prod1 | 10.00 |
            |  2 | prod2 | 20.00 |
            |  3 | prod3 | 30.00 |
            +----+-------+-------+

You can

  • Use the id/name columns to get your product dropdown.
  • Use id/price columns to create your prices array.

I don't know what SS Req, MS Req etc are, or how they relate to products, so I can't comment on those

33 minutes ago, Maihes said:

what i meant about the variables for the prices is that they are required anyway for them to be displayed

No, they are not required. The array elements are your variables

If you want to display the price for product 2 then you don't need $ESSPrice, just

echo $prices[ $prods[2] ] 

Share this post


Link to post
Share on other sites

I've just looked at the data in your sql dump files.

Did I say the design was terrible? I apologise for the gross understatement and for referring to it as a database :)

As I hope I demonstrated in my earlier posts, if you get the data right the processing becomes a whole lot easier.

Nothing in the other tables matches those column names in your prices table, so all of my solutions go out of the window. There might have been some hope if the first column in prices mapped to id #1 and the 2nd column to id #2 but even that isn't the case. I'll check if dropping "Price" suffix from the column names can save the day.

I'll have a look at your code now, but first I need a stiff drink, or several - a large gin and tonic should help.

  • Haha 2

Share this post


Link to post
Share on other sites

Ok, so based on what you said i changed a bit the db and merged product with prices and the file looks like this now:

CREATE TABLE `pricelist` (
  `Id` int(11) NOT NULL,
  `Product` varchar(13) DEFAULT NULL,
  `Price` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `pricelist` 
(`Id`, `Product`, `Price`) VALUES
  (1, 'TS', '17'), 
  (2, 'ESS', '200'), 
  (3, 'ASBB', '70'), 
  (4, 'MSBB', '300'), 
  (5, 'KA', '30'), 
  (6, 'CFS', '80'), 
  (7, 'BK', '30'), 
  (8, 'ODP', '300'), 
  (9, 'GTDP', '1000'), 
  (10, 'GSDP', '1500'), 
  (11, 'SLGH', '25'), 
  (12, 'RCB', '10'), 
  (13, 'RCCB', '10'), 
  (14, 'CCB', '450'), 
  (15, 'STOR', '500'), 
  (16, 'CPC', '10'), 
  (17, 'PPPC', '10'), 
  (18, 'PPC', '10'), 
  (19, 'APC', '10'), 
  (20, 'MDFC', '10'), 
  (21, 'SDFC', '10'), 
  (22, 'MTDFC', '10'), 
  (23, 'DSFC', '10'), 
  (24, 'SS', '1'), 
  (25, 'MS', '8'), 
  (26, 'SO', '3'), 
  (27, 'EO', '7');

ALTER TABLE `pricelist`
  ADD PRIMARY KEY (`Id`);

ALTER TABLE `pricelist`
  MODIFY `Id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=28;
COMMIT;

so than this can be used for both the prices and for the product dropdown as long as the last 4 rows are not used for the dropdown list then a new `bundle` table for the second dropdown which its the same as the `books` one i sent you(just column names are Id,Pid,Bname) and then lastly the `dopdown` table which remains the same.

Edited by Maihes

Share this post


Link to post
Share on other sites

Don't rely on table position (last four). Add a "dropdown" flag (1 = used in dropdown, 0 = not)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.