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