Php 如何从多维数组中获取和操作值并按行显示

Php 如何从多维数组中获取和操作值并按行显示,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我想这样做 #1-如果有多个同名门店,则门店名称仅显示一次。 #2-同一存储的所有地址都应与该存储一起显示。 #3-不同地点的同一家商店价格相同,因此价格只能显示一次。 #4-希望按行显示以上所有信息(使用循环) 我试着跟随,但没有正常工作。它只给了我一次类似的商店名称,也给了那个商店不同的位置。但价格并不是每个唯一的商店名称只显示一次 array(2) { ["storeData"]=> array(10) { [0]=> array

我想这样做 #1-如果有多个同名门店,则门店名称仅显示一次。 #2-同一存储的所有地址都应与该存储一起显示。 #3-不同地点的同一家商店价格相同,因此价格只能显示一次。 #4-希望按行显示以上所有信息(使用循环)

我试着跟随,但没有正常工作。它只给了我一次类似的商店名称,也给了那个商店不同的位置。但价格并不是每个唯一的商店名称只显示一次

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) 
        }
     }
}     
$cnt=1;
if(is_数组($json)&&!空($json))
{
foreach($json作为$key1=>$level1)
{
if(is_数组($level1)&&!空($level1))
{
foreach($level1作为$key2=>$level2)
{
如果($cnt==1)
{
$str_name=$level2['name'];
echo“----”$level2['name']。“----
”; } 如果($str_name==$level2['name']) { echo$level2[“地址”]。“-”; echo$level2['zip']。“-”; } else if($str_name!=$level2['name'])) { $str_name=$level2['name']; echo“----”$level2['name']。“----
”; echo$level2[“地址”]。“-”; echo$level2['zip']。“-”; } if(is_数组($level2)&&!空($level2)) { foreach($level2作为$key3=>$level3) { if(is_数组($level3)&&!空($level3)) { foreach($level3作为$key4=>$level4) { 如果($cnt==1) { 回声“$level4['price']”,
; } 如果($str_name!=$level2['name'])) { 回声“$level4['price']”,
; } } } } } $cnt++; } } } }

那么,我应该在我的上面做些什么改变,使它像我上面提到的那样工作呢?或者,如果这不起作用,请建议完全不同的解决方案?

不是说你的代码不起作用,但对我来说,它试图解决的问题相当复杂。 我将此任务分为两个阶段:1。将数据转换为所需的格式。2.按您认为合适的方式显示数据

$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++;
            }
        }
    }
}
这正是你所要求的:每个条目都是一个商店,每个商店都有所有的位置,单一的价格

现在,它可以根据您的需要显示(html、控制台输出等,我使用了控制台输出并获得):

如果您希望html将
PHP\u EOL
替换为

编辑:没有位置地址作为键的代码:

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
$stores

// 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']];
  }
}

您好,我正在尝试上面的代码,但在var_dump中有一个疑问,地址本身显示为键名(3001 N STATE ROAD 7),如下所示:数组(1){[“WALMART”]=>array(3){[“name”]=>string(7)“WALMART”[“price”]=>float(31.14)[“locations”]=>array(5){[“3001 N STATE ROAD 7”]=>array(2){[“address”]=>string(19)“3001N国道7号”[“zip”]=>string(5)“33313”}如果您不必检查存储区的重复地址,则不需要此选项,但也不会在以后的渲染中使用。如果需要,您可以删除位置中的键以仅包含数值。无论如何,如果出于某种原因,这对您来说是个问题,请添加一个编辑,并使用不带地址的代码作为键。这两种解决方案都适用于Ty,并且它正在按照我的要求工作在我的问题中。是否可以根据zip对相同的数组结果进行排序?目前已排序(升序)根据价格,请让我知道。如果它工作,你考虑接受答案。是可能的,但你想保持商店的顺序,但排序的位置,根据zip在每个商店内?你总是可以使用UsRoT函数,像这样的代码> UrORT($地点,函数($a,b){返回$a[zip’)-$b[zip’,})在每个位置阵列上(foreach商店)
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
// 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']];
  }
}
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"
      }
    }
  }
}