【问题标题】:PHP - Check if values in one array exist in another array multi-dimensional arrayPHP - 检查一个数组中的值是否存在于另一个数组多维数组中
【发布时间】:2016-06-18 15:21:28
【问题描述】:

我有以下两个数组。

这是一个平面数组(字符串:$second_names):

Array ( [0] => Cars [3] => Bikes [8] => Trucks ) //$second_names

我有这个多维数组 - (string: $premiumCatArraySets):

Array
(
    [0] => Array
        (
            [primary-category] => Automobiles
            [secondary-category] => Cars
            [tertiary-category] => Fiat Punto
        )
[1] => Array
    (
        [primary-category] => Automobiles
        [secondary-category] => Cars
        [tertiary-category] => BMW
    )

[2] => Array
    (
        [primary-category] => Automobiles
        [secondary-category] => Bikes
        [tertiary-category] => Honda
    )

[4] => Array
    (
        [primary-category] => Automobiles
        [secondary-category] => Trucks
        [tertiary-category] => Iveco
    )

[6] => Array
    (
        [primary-category] => Automobiles
        [secondary-category] => Cars
        [tertiary-category] => Mercedes
    )

[9] => Array
    (
        [primary-category] => Automobiles
        [secondary-category] => Cars
        [tertiary-category] => Toyota
    )

我正在尝试使用in_array查看平面数组中的值是否存在并输出汽车的品牌。

这是我尝试过的

foreach ($second_names as $second_name) {//Vechile type e.g. car, truck, bike
    if(in_array($second_name, $premiumCatArraySets)){
        echo '<h2>'.$second_name.'</h2>';
        foreach ($third_names as $third_name) {// e.g. Fiat, BMW, Toyota
            echo $third_name.'<br/>';
        }
    }
}

if(in_array($second_name, $premiumCatArraySets)){ 的行似乎没有显示任何内容。

【问题讨论】:

    标签: php arrays multidimensional-array


    【解决方案1】:

    如果我的理解是正确的,您必须从第二个数组中为第一个数组中的每辆车获取车辆品牌。您可以执行以下操作。这是一个基本脚本。

    <?php
    
    $vehicles = ['Cars', 'Bikes', 'Trucks'];
    
    $details = [
        [
            'primary-category' => 'Automobiles',
            'secondary-category' => 'Cars',
            'tertiary-category' => 'BMW'
        ],
        [
            'primary-category' => 'Automobiles',
            'secondary-category' => 'Trucks',
            'tertiary-category' => 'Benz'
        ]
    ];
    
    foreach ($vehicles as $vehicle) {
        foreach ($details as $detail) {
            if ($vehicle == $detail['secondary-category']) {
                echo $detail['tertiary-category'];
                break;
            }
        }
    }
    
    ?>
    

    【讨论】:

    • 谢谢。它告诉我PHP Fatal error: Function name must be a string if ($vehicle == $detail['secondary-category']) {
    • 您尝试在我的回答中执行相同的脚本?对我很有魅力!
    • 是的,我确实尝试过小规模的。$secondary_names = array('Cars', 'Bikes', 'Trucks'); $details = array( 0 =&gt; array( 'primary-category' =&gt; 'Automobiles', 'secondary-category' =&gt; 'Cars', 'tertiary-category' =&gt; 'BMW', ), 1 =&gt; array( 'primary-category' =&gt; 'Automobiles', 'secondary-category' =&gt; 'Trucks', 'tertiary-category' =&gt; 'Benz', ) );
    • 复制并粘贴导致错误的整个脚本。我去看看。
    • 好的。我想我成功了。我在脚本中使用了圆括号而不是方括号。因为我使用了查找和替换功能:-)
    【解决方案2】:

    试试

    $output = [];
    foreach($premiumCatArraySets as $key => $value){    
        if(in_array($value["secondary-category"],$second_names)){
            if(!isset($output[$value["secondary-category"]])){
                $output[$value["secondary-category"]]  = [];
            }        
            $output[$value["secondary-category"]][] = $value["tertiary-category"];
        }
    }
    foreach($output as $key => $value){ 
        echo '<h2>'.$key."</h2>";
            echo implode(", ",$value)."<br/>";
    }
    

    输出

    Cars    
    Fiat Punto, BMW, Mercedes, Toyota
    
    Bikes    
    Honda
    
    Trucks    
    Iveco
    

    参考:Demo

    【讨论】:

      【解决方案3】:

      使用call_user_func_arrayarray_merge_recursivearray_keysarray_fliparray_intersect_keyimplode函数的解决方案:

      // grouping each category preserving the position of each item
      $groups = call_user_func_array('array_merge_recursive', $premiumCatArraySets);
      foreach ($second_names as $name) {
          $indexes = array_flip(array_keys($groups['secondary-category'], $name));
          echo '<h2>'.$name.'</h2>';
          echo implode(", ", array_intersect_key($groups['tertiary-category'], $indexes)) .'<br/>';
      }
      

      输出:

      &lt;h2&gt;Cars&lt;/h2&gt;Fiat Punto, BMW, Mercedes, Toyota&lt;br/&gt;&lt;h2&gt;Bikes&lt;/h2&gt;Honda&lt;br/&gt;&lt;h2&gt;Trucks&lt;/h2&gt;Iveco&lt;br/&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-09
        • 1970-01-01
        • 1970-01-01
        • 2010-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多