繁体   English   中英

循环数组并仅保留与具有限定值的特定键相关的元素

[英]Loop an array and retain only elements that relate to a specific key with a qualifying value

我有这个数组:

(
  [id] => block_5df755210d30a
  [name] => acf/floorplans
  [data] => Array
  (
    [floorplans_0_valid_for_export] => 0
    [floorplans_0_title] => title 1
    [floorplans_0_house_area] => 40m²
    [floorplans_0_bedrooms] => 1
    [floorplans_1_valid_for_export] => 1
    [floorplans_1_title] => title xx
    [floorplans_1_house_area] => 90m²
    [floorplans_1_bedrooms] => 2
    [floorplans_2_valid_for_export] => 1
    [floorplans_2_title] => title 2
    [floorplans_2_house_area] => 50m²
    [floorplans_2_bedrooms] => 1
    [floorplans] => 3

  )
)

正如我们在数据中看到的那样,我们有字段 ( floorplans_X_valid_for_export )。 我想做的是仅当此字段等于1时才获取数据。

因此,从给定的示例中,我只想保留这些字段:

[floorplans_1_valid_for_export] => 1
[floorplans_1_title] => title xx
[floorplans_1_house_area] => 90m²
[floorplans_1_bedrooms] => 2
[floorplans_2_valid_for_export] => 1
[floorplans_2_title] => title 2
[floorplans_2_house_area] => 50m²
[floorplans_2_bedrooms] => 1

这是一个奇怪的模式,但它可以通过遍历数组并搜索“valid_for_export”等于 1 的键,然后使用另一个字段“stubs”数组通过floorplans_X_valid_for_export中的唯一标识符 X 获取关联项来完成

$array = [
    'floorplans_0_valid_for_export' => 0,
    'floorplans_0_title' => 'title 1',
    'floorplans_0_house_area' => '40m²',
    'floorplans_0_bedrooms' => 1,
    'floorplans_1_valid_for_export' => 1,
    'floorplans_1_title' => 'title xx',
    'floorplans_1_house_area' => '90m²',
    'floorplans_1_bedrooms' => '2',
    'floorplans_2_valid_for_export' => 1,
    'floorplans_2_title' => 'title 2',
    'floorplans_2_house_area' => '50m²',
    'floorplans_2_bedrooms' => 1,
    'floorplans' => 3
];


$stubs = [
     'floorplans_%s_valid_for_export',
     'floorplans_%s_title',
     'floorplans_%s_house_area',
     'floorplans_%s_bedrooms'
];

$newArr = [];

foreach ($array as $key => $value) {
    if (strpos($key, 'valid_for_export') && $array[$key] == 1) {
        $intVal = filter_var($key, FILTER_SANITIZE_NUMBER_INT);
        foreach ($stubs as $stub) {
            $search = sprintf($stub, $intVal);
            if (isset($array[$search])) {
                $newArr[$search] = $array[$search];
            } else {
                // key can't be found, generate one with null
                $newArr[$search] = null;
            }
        }
    }
}

echo '<pre>';
print_r($newArr);

工作: http://sandbox.onlinephpfunctions.com/code/23a225e3cefa2dc9cc97f53f1cbae0ea291672c0

使用父循环来检查数字特定的valid_for_export值是否为非空——因为它要么为 0,要么为非零。

如果是这样,则只需将所有关联的元素推入结果数组即可。

这个答案优于@Alex 的答案的一些原因是:

  1. Alex 的父循环进行了 13 次迭代(以及相同数量的strpos()调用); 我的只有 3 个(并且只有 3 个调用empty() )。
  2. $array[$key]更简单地写为$value
  3. 如我的回答所示,清理$key以提取索引/计数器的开销比必要的要多。

代码(演示

$array = [
    'floorplans_0_valid_for_export' => 0,
    'floorplans_0_title' => 'title 1',
    'floorplans_0_house_area' => '40m²',
    'floorplans_0_bedrooms' => 1,
    'floorplans_1_valid_for_export' => 1,
    'floorplans_1_title' => 'title xx',
    'floorplans_1_house_area' => '90m²',
    'floorplans_1_bedrooms' => '2',
    'floorplans_2_valid_for_export' => 1,
    'floorplans_2_title' => 'title 2',
    'floorplans_2_house_area' => '50m²',
    'floorplans_2_bedrooms' => 1,
    'floorplans' => 3
];

$labels = ['valid_for_export', 'title', 'house_area', 'bedrooms'];

$result = [];
for ($i = 0; $i < $array['floorplans']; ++$i) {
    if (!empty($array['floorplans_' . $i . '_valid_for_export'])) {
        foreach ($labels as $label) {
            $key = sprintf('floorplans_%s_%s', $i, $label);
            $result[$key] = $array[$key];
        }
    }
}
var_export($result);

Output:

array (
  'floorplans_1_valid_for_export' => 1,
  'floorplans_1_title' => 'title xx',
  'floorplans_1_house_area' => '90m²',
  'floorplans_1_bedrooms' => '2',
  'floorplans_2_valid_for_export' => 1,
  'floorplans_2_title' => 'title 2',
  'floorplans_2_house_area' => '50m²',
  'floorplans_2_bedrooms' => 1,
)

使用构建的数据可能很难(不是不可能的),hovewer 我建议将其更改为多维 arrays 所以你有这样的东西:

[floorplans][0][valid_for_export] => 0
[floorplans][0][title] => title 1
[floorplans][0][house_area] => 40m²
[floorplans][0][bedrooms] => 1
[floorplans][1][valid_for_export] => 1
[floorplans][1][title] => title xx
[floorplans][1][house_area] => 90m²

粗略的解决方案

这不是最好的方法,但如果您不需要任何花哨的东西并且知道数据结构将来不会改变,它应该可以工作

$keys = [];
$for($i=0;$i<$array['floorplans'];++$i) {
    if(isset($array['floorplans_'.$i.'_valid_for_export']) && $array['floorplans_'.$i.'_valid_for_export']===1) {
        $keys[] = $i;
    }
}

print_r($keys);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM