Как получать значения из многомерного массива и манипулировать ими, а также отображать их по строкам - PullRequest
0 голосов
/ 12 июля 2020
array(2) { 
    ["storeData"]=> array(10) { 
        [0]=> array(18) { 
            ["name"]=> string(7) "STORENAME 01" 
            ["address"]=> string(19) "THIS IS ADDRESS 01"
            ["zip"]=> string(5) "33312" 
            ["pricing"]=> array(1) {
                [0]=> array(4) { 
                    ["price"]=> float(30.00) 
                } 
            } 
            ["distance"]=> float(3.0000) 

        }
        [1]=> array(18) { 
            ["name"]=> string(7) "STORENAME 02" 
            ["address"]=> string(19) "THIS IS ADDRESS 02"
            ["zip"]=> string(5) "33302" 
            ["pricing"]=> array(1) {
                [0]=> array(4) { 
                    ["price"]=> float(35.00) 
                } 
            } 
            ["distance"]=> float(2.0000) 
        }
        [2]=> array(18) { 
            ["name"]=> string(7) "STORENAME 01" 
            ["address"]=> string(19) "SAME STORE BUT AT DIFFERENT LOCATION"
            ["zip"]=> string(5) "33301" 
            ["pricing"]=> array(1) {
                [0]=> array(4) { 
                    ["price"]=> float(30.00) 
                } 
            } 
            ["distance"]=> float(3.5000) 
        }
     }
}     

Я хочу сделать так, чтобы # 1 - имя магазина отображалось только один раз, если существует более одного магазина с таким же именем. # 2 - Тогда все адреса одного и того же магазина должны отображаться с этим магазином. # 3 - Один и тот же магазин в разных местах будет иметь одинаковую цену, поэтому цена должна отображаться только один раз. # 4 - Хотите отобразить всю приведенную выше информацию в строке (используя l oop)

Я пробовал следовать, но не работал должным образом. Он дает мне похожие названия магазинов только один раз, а также указывает разные места для этого магазина. Но цена не отображается только один раз для каждого уникального названия магазина.

$cnt = 1; 
if (is_array($json) && !empty($json))
{
    foreach ($json as $key1 => $level1)
    {
        if (is_array($level1) && !empty($level1))
        {
            foreach ($level1 as $key2 => $level2)
            {
                if($cnt == 1)
                {
                    $str_name = $level2['name'];
                    echo "----- ".$level2['name']." -----<br/>";
                }
                if($str_name == $level2['name'])
                {
                    echo $level2['address']." - ";
                    echo $level2['zip']." - ";
                }
                else if($str_name != $level2['name'])
                {
                    $str_name = $level2['name'];
                    echo "----- ".$level2['name']." -----<br/>";

                    echo $level2['address']." - ";
                    echo $level2['zip']." - ";
                }

                if (is_array($level2) && !empty($level2))
                {
                    foreach ($level2 as $key3 => $level3)
                    {
                        if (is_array($level3) && !empty($level3))
                        {
                            foreach ($level3 as $key4 => $level4)
                            {
                                if($cnt == 1)
                                {
                                    echo "<b>".$level4['price']."</b> <br/>";
                                }

                                if($str_name != $level2['name'])
                                {
                                    echo "<b>".$level4['price']."</b> <br/>";
                                }                                
                            }
                        }
                    }
                }
                $cnt++;
            }
        }
    }
}

Итак, какие изменения я должен сделать в моем выше, чтобы он работал так, как я упоминал выше? Или предложите совершенно другое решение (а), если оно не сработает?

1 Ответ

0 голосов
/ 12 июля 2020

Не говорю, что ваш код не будет работать, но для меня это довольно сложно для того, что он пытается решить. Я бы разделил эту задачу на 2 этапа: 1. Преобразование данных в нужный вам формат. 2. Отобразите данные по своему усмотрению.

<?php
$data = [
    "storeData"=> [ 
        0=> [ 
            "name"=>"STORENAME 01", 
            "address"=> "THIS IS ADDRESS 01",
            "zip"=> "33312", 
            "pricing"=> [
                0=> [ 
                    "price"=> 30.00, 
                ], 
            ], 
            "distance"=> 3.0000, 

        ],
        1=> [ 
            "name"=> "STORENAME 02", 
            "address"=> "THIS IS ADDRESS 02",
            "zip"=> "33302", 
            "pricing"=> [
                0=> [ 
                    "price"=> 35.00, 
                ],
            ], 
            "distance"=> 2.0000, 
        ],
        2=> [ 
            "name"=> "STORENAME 01", 
            "address"=> "SAME STORE BUT AT DIFFERENT LOCATION",
            "zip"=> "33301", 
            "pricing"=> [
                0=> [ 
                    "price"=> 30.00, 
                ], 
            ], 
            "distance"=> 3.5000, 
        ],
     ],
];

// 1. transform to what is needed
$stores = [];
foreach ($data['storeData'] as $store) {
  if (!isset($stores[$store['name']])) {
    $stores[$store['name']] = ['name' => $store['name'], 'price' => $store['pricing'][0]['price'], 'locations'=>[$store['address'] => ['address' => $store['address'], 'zip' => $store['zip']]]];
  } else {
    $stores[$store['name']]['locations'][$store['address']] = ['address' => $store['address'], 'zip' => $store['zip']];
  }
}

var_dump($stores);

// 2. display
foreach ($stores as $store) {
  echo 'store: '.$store['name'].PHP_EOL;
  echo '  locations:'.PHP_EOL;
  foreach ($store['locations'] as $location) {
    echo '    '.$location['address'].' '.$location['zip'].PHP_EOL;
  }
  echo '  price: '.$store['price'].PHP_EOL;
}

Это переменная $stores:

array(2) {
  ["STORENAME 01"]=>
  array(3) {
    ["name"]=>
    string(12) "STORENAME 01"
    ["price"]=>
    float(30)
    ["locations"]=>
    array(2) {
      ["THIS IS ADDRESS 01"]=>
      array(2) {
        ["address"]=>
        string(18) "THIS IS ADDRESS 01"
        ["zip"]=>
        string(5) "33312"
      }
      ["SAME STORE BUT AT DIFFERENT LOCATION"]=>
      array(2) {
        ["address"]=>
        string(36) "SAME STORE BUT AT DIFFERENT LOCATION"
        ["zip"]=>
        string(5) "33301"
      }
    }
  }
  ["STORENAME 02"]=>
  array(3) {
    ["name"]=>
    string(12) "STORENAME 02"
    ["price"]=>
    float(35)
    ["locations"]=>
    array(1) {
      ["THIS IS ADDRESS 02"]=>
      array(2) {
        ["address"]=>
        string(18) "THIS IS ADDRESS 02"
        ["zip"]=>
        string(5) "33302"
      }
    }
  }
}

Это именно то, что вы просили: каждая запись является хранилищем, каждая В магазине есть все адреса, единая цена.

Теперь его можно отображать так, как вы хотите (html, вывод на консоль и т.д. c. Я использовал вывод консоли и получил):

store: STORENAME 01
  locations:
    THIS IS ADDRESS 01 33312
    SAME STORE BUT AT DIFFERENT LOCATION 33301
  price: 30
store: STORENAME 02
  locations:
    THIS IS ADDRESS 02 33302
  price: 35

Если вы хотите html, замените PHP_EOL на <br />

Изменить: код без адресов местоположения в качестве ключей:

// transform to what is needed
$stores = [];
foreach ($data['storeData'] as $store) {
  if (!isset($stores[$store['name']])) {
    $stores[$store['name']] = ['name' => $store['name'], 'price' => $store['pricing'][0]['price'], 'locations'=> [['address' => $store['address'], 'zip' => $store['zip']]]];
  } else {
    $stores[$store['name']]['locations'][] = ['address' => $store['address'], 'zip' => $store['zip']];
  }
}

$stores:

array(2) {
  ["STORENAME 01"]=>
  array(3) {
    ["name"]=>
    string(12) "STORENAME 01"
    ["price"]=>
    float(30)
    ["locations"]=>
    array(2) {
      [0]=>
      array(2) {
        ["address"]=>
        string(18) "THIS IS ADDRESS 01"
        ["zip"]=>
        string(5) "33312"
      }
      [1]=>
      array(2) {
        ["address"]=>
        string(36) "SAME STORE BUT AT DIFFERENT LOCATION"
        ["zip"]=>
        string(5) "33301"
      }
    }
  }
  ["STORENAME 02"]=>
  array(3) {
    ["name"]=>
    string(12) "STORENAME 02"
    ["price"]=>
    float(35)
    ["locations"]=>
    array(1) {
      [0]=>
      array(2) {
        ["address"]=>
        string(18) "THIS IS ADDRESS 02"
        ["zip"]=>
        string(5) "33302"
      }
    }
  }
}
...