如何通过删除重复项来缩小数组并根据键值差异分配新的字符串值?

时间:2016-05-22 15:51:41

标签: php arrays

有一个数组,它显示了搜索食品名称的餐馆列表,需要将其缩小到独特的结果。 您可以看到此数组可以包含重复的餐馆名称,关键因素是如果餐馆名称匹配但是准备时间不同,则阵列需要分配具有“多选项”值的字符串的准备时间。

数组:

$restaurants = array (
  1 => 
  array (
    'restaurant' => 'Chefoncall',
    'slug' => 'chefoncall1',
    'lat' => 45.495869200000001,
    'long' => -73.57524699999999,
    'distance' => '0.07',
    'preparation' => 0,
  ),
  2 => 
  array (
    'restaurant' => 'Chefoncall',
    'slug' => 'chefoncall1',
    'lat' => 45.495869200000001,
    'long' => -73.57524699999999,
    'distance' => '0.07',
    'preparation' => 0,
  ),
  3 => 
  array (
    'restaurant' => 'Chefoncall',
    'slug' => 'chefoncall1',
    'lat' => 45.495869200000001,
    'long' => -73.57524699999999,
    'distance' => '0.07',
    'preparation' => 0,
  ),
  4 => 
  array (
    'restaurant' => 'Chefoncall',
    'slug' => 'chefoncall1',
    'lat' => 45.495869200000001,
    'long' => -73.57524699999999,
    'distance' => '0.07',
    'preparation' => 0,
  ),
  5 => 
  array (
    'restaurant' => 'Chefoncall',
    'slug' => 'chefoncall1',
    'lat' => 45.495869200000001,
    'long' => -73.57524699999999,
    'distance' => '0.07',
    'preparation' => 15,
  ),
  6 => 
  array (
    'restaurant' => 'Chefoncall',
    'slug' => 'chefoncall1',
    'lat' => 45.495869200000001,
    'long' => -73.57524699999999,
    'distance' => '0.07',
    'preparation' => 10,
  ),
  7 => 
  array (
    'restaurant' => 'Chefoncall',
    'slug' => 'chefoncall1',
    'lat' => 45.495869200000001,
    'long' => -73.57524699999999,
    'distance' => '0.07',
    'preparation' => 20,
  ),
  8 => 
  array (
    'restaurant' => 'Chefoncall',
    'slug' => 'chefoncall1',
    'lat' => 45.495869200000001,
    'long' => -73.57524699999999,
    'distance' => '0.07',
    'preparation' => 0,
  ),
  9 => 
  array (
    'restaurant' => 'Chefoncall',
    'slug' => 'chefoncall1',
    'lat' => 45.495869200000001,
    'long' => -73.57524699999999,
    'distance' => '0.07',
    'preparation' => 0,
  ),
  10 => 
  array (
    'restaurant' => 'Chefoncall',
    'slug' => 'chefoncall1',
    'lat' => 45.495869200000001,
    'long' => -73.57524699999999,
    'distance' => '0.07',
    'preparation' => 5,
  ),
  11 => 
  array (
    'restaurant' => 'Chefoncall',
    'slug' => 'chefoncall1',
    'lat' => 45.495869200000001,
    'long' => -73.57524699999999,
    'distance' => '0.07',
    'preparation' => 0,
  ),
  12 => 
  array (
    'restaurant' => 'Chefoncall',
    'slug' => 'chefoncall1',
    'lat' => 45.495869200000001,
    'long' => -73.57524699999999,
    'distance' => '0.07',
    'preparation' => 0,
  ),
  13 => 
  array (
    'restaurant' => 'Alto Burger',
    'slug' => 'alto-burger',
    'lat' => 45.487302399999997,
    'long' => -73.637301199999996,
    'distance' => '3.04',
    'preparation' => 10,
  ),
  14 => 
  array (
    'restaurant' => 'Alto Burger',
    'slug' => 'alto-burger',
    'lat' => 45.487302399999997,
    'long' => -73.637301199999996,
    'distance' => '3.04',
    'preparation' => 10,
  ),
  15 => 
  array (
    'restaurant' => 'Subway',
    'slug' => 'subway1',
    'lat' => 45.268204699999998,
    'long' => -72.143240399999996,
    'distance' => '71.29',
    'preparation' => 3,
  ),
)

此数组显示:

  1. Chefoncall (具有不同的准备时间值),需要提供一个阵列,其准备值为“多选项”。
  2. Alto Burger (有2个阵列,但制备时间相同,为10个),需要提供一个阵列,准备时间为10个。
  3. 地铁(这个数组有一个数组,准备时间为3),需要提供,因为无需更改。
  4. 所需的输出

      $restaurantsdownsized = array (
      1 => 
      array (
        'restaurant' => 'Chefoncall',
        'slug' => 'chefoncall1',
        'lat' => 45.495869200000001,
        'long' => -73.57524699999999,
        'distance' => '0.07',
        'preparation' => 'multi-option',
      ),
      14 => 
      array (
        'restaurant' => 'Alto Burger',
        'slug' => 'alto-burger',
        'lat' => 45.487302399999997,
        'long' => -73.637301199999996,
        'distance' => '3.04',
        'preparation' => 10,
      ),
      15 => 
      array (
        'restaurant' => 'Subway',
        'slug' => 'subway1',
        'lat' => 45.268204699999998,
        'long' => -72.143240399999996,
        'distance' => '71.29',
        'preparation' => 3,
      ),
    )
    

    然后它需要生成以下div元素,以便将其作为标记添加到谷歌地图。

        foreach($restaurantsdownsized as $mp){  
            echo '<div class="radarmarkers" 
                    data-lat="'.$mp['lat'].'" 
                    data-long="'.$mp['long'].'" 
                    data-title="'.$mp['restaurant'].'"
                    data-preparation= "'.$mp['preparation'].' '.t('Minutes').'"
                    data-map-icon= "icon_'.$mp['preparation'].'"
                    ></div>';
        }
    

2 个答案:

答案 0 :(得分:1)

我不确定我是否可以回答我自己的问题,但这是我提出的解决方案:

$temprestaurants = $restaurants;
if(count($restaurants) > 1){
        $range  = range(1, count($restaurants));

        foreach($restaurants as $key => $value ){
            foreach($range as $x){
                if($value['slug']==$temprestaurants[$x]['slug']){
                    if($temprestaurants[$x]['preparation']!= $value['preparation']){
                        $temprestaurants[$x]['preparation'] = "multi-option";
                    }
                }
            }
        }
}
$restaurantsdownsized = array_map("unserialize", array_unique(array_map("serialize",$temprestaurants)));
var_dump($restaurantsdownsized);

产生所需的输出

array(3) {
  [1]=>
  array(6) {
    ["restaurant"]=>
    string(10) "Chefoncall"
    ["slug"]=>
    string(11) "chefoncall1"
    ["lat"]=>
    float(45.4958692)
    ["long"]=>
    float(-73.575247)
    ["distance"]=>
    string(4) "0.07"
    ["preparation"]=>
    string(12) "multi-option"
  }
  [13]=>
  array(6) {
    ["restaurant"]=>
    string(11) "Alto Burger"
    ["slug"]=>
    string(11) "alto-burger"
    ["lat"]=>
    float(45.4873024)
    ["long"]=>
    float(-73.6373012)
    ["distance"]=>
    string(4) "3.04"
    ["preparation"]=>
    int(10)
  }
  [15]=>
  array(6) {
    ["restaurant"]=>
    string(6) "Subway"
    ["slug"]=>
    string(7) "subway1"
    ["lat"]=>
    float(45.2682047)
    ["long"]=>
    float(-72.1432404)
    ["distance"]=>
    string(5) "71.29"
    ["preparation"]=>
    int(3)
  }
}

答案 1 :(得分:0)

function unique_multidim_array($array, $key) {
$temp_array = array();
$i = 0;
$key_array = array();

foreach($array as $val) {
    if (!in_array($val[$key], $key_array)) {
        $key_array[$i] = $val[$key];
        $temp_array[$i] = $val;
    }
    $i++;
}
return $temp_array;

}

$restaurants = array (

1 => array ( 'restaurant' => 'Chefoncall', 'slug' => 'chefoncall1', 'lat' => 45.495869200000001, 'long' => -73.57524699999999, 'distance' => '0.07', 'preparation' => 0, ), 2 => array ( 'restaurant' => 'Chefoncall', 'slug' => 'chefoncall1', 'lat' => 45.495869200000001, 'long' => -73.57524699999999, 'distance' => '0.07', 'preparation' => 0, ), 3 => array ( 'restaurant' => 'Chefoncall', 'slug' => 'chefoncall1', 'lat' => 45.495869200000001, 'long' => -73.57524699999999, 'distance' => '0.07', 'preparation' => 0, ), 4 => array ( 'restaurant' => 'Chefoncall', 'slug' => 'chefoncall1', 'lat' => 45.495869200000001, 'long' => -73.57524699999999, 'distance' => '0.07', 'preparation' => 0, ), 5 => array ( 'restaurant' => 'Chefoncall', 'slug' => 'chefoncall1', 'lat' => 45.495869200000001, 'long' => -73.57524699999999, 'distance' => '0.07', 'preparation' => 15, ), 6 => array ( 'restaurant' => 'Chefoncall', 'slug' => 'chefoncall1', 'lat' => 45.495869200000001, 'long' => -73.57524699999999, 'distance' => '0.07', 'preparation' => 10, ), 7 => array ( 'restaurant' => 'Chefoncall', 'slug' => 'chefoncall1', 'lat' => 45.495869200000001, 'long' => -73.57524699999999, 'distance' => '0.07', 'preparation' => 20, ), 8 => array ( 'restaurant' => 'Chefoncall', 'slug' => 'chefoncall1', 'lat' => 45.495869200000001, 'long' => -73.57524699999999, 'distance' => '0.07', 'preparation' => 0, ), 9 => array ( 'restaurant' => 'Chefoncall', 'slug' => 'chefoncall1', 'lat' => 45.495869200000001, 'long' => -73.57524699999999, 'distance' => '0.07', 'preparation' => 0, ), 10 => array ( 'restaurant' => 'Chefoncall', 'slug' => 'chefoncall1', 'lat' => 45.495869200000001, 'long' => -73.57524699999999, 'distance' => '0.07', 'preparation' => 5, ), 11 => array ( 'restaurant' => 'Chefoncall', 'slug' => 'chefoncall1', 'lat' => 45.495869200000001, 'long' => -73.57524699999999, 'distance' => '0.07', 'preparation' => 0, ), 12 => array ( 'restaurant' => 'Chefoncall', 'slug' => 'chefoncall1', 'lat' => 45.495869200000001, 'long' => -73.57524699999999, 'distance' => '0.07', 'preparation' => 0, ), 13 => array ( 'restaurant' => 'Alto Burger', 'slug' => 'alto-burger', 'lat' => 45.487302399999997, 'long' => -73.637301199999996, 'distance' => '3.04', 'preparation' => 10, ), 14 => array ( 'restaurant' => 'Alto Burger', 'slug' => 'alto-burger', 'lat' => 45.487302399999997, 'long' => -73.637301199999996, 'distance' => '3.04', 'preparation' => 10, ), 15 => array ( 'restaurant' => 'Subway', 'slug' => 'subway1', 'lat' => 45.268204699999998, 'long' => -72.143240399999996, 'distance' => '71.29', 'preparation' => 3, ), ); $restaurants = unique_multidim_array($restaurants,'preparation'); var_dump($restaurants);

在我看来,你可以得到独特的餐厅或独特的准备时间。