简体   繁体   中英

Map two dimensional php array to 1 dimension

I have array inside array:

{
"0" => array("key" => "code", "id" => "4", "value" => "yes"),
"1" => array("key" => "parameter", "id" => "4", "value" => "0"),
"2" => array("key" => "code", "id" => "5", "value" => "no"),
etc...
}

This is what I want to do: I want to have one dimension array in which key would be "id" and value would be "value". However, I need to filter out entries whose key is "parameters". So, in this example, the final array should look like this:

{
"4" => "yes",
"5" => "no"
}

I just can't seem to figure out how to do this. Could you please help me a bit? I tried writing this foreach inside foreach but I just can't wrap my head around how to filter data.

foreach ($settings AS $key => $value) {
            $id = null;
            $value = null;

            foreach ($value AS $key2 => $value2) {
                // No idea how to filter out uneccesary entries and save the correct ones
            }

            $finalArray[$id] = $value;
        }

This should do it :

$finalArray = array();
foreach ($settings as $setting) {
    if ($setting['key'] != 'parameter') {
        $finalArray[$setting['id']] = $setting['value'];
    }
}

Assuming all your entries have keys 'key', 'id' and 'value'.

use array_column and array_filter like this, if you want to filter more keys add them to out_keys array :

<?php

$array = [
   ["key" => "code", "id" => "4", "value" => "yes"],
   ["key" => "parameter", "id" => "4", "value" => "0"],
   ["key" => "code", "id" => "5", "value" => "no"]
];

$out_keys = ['parameter'];

$result = array_column(array_filter($array, function($item) use($out_keys) {
   return !in_array($item['key'], $out_keys);
}), 'value', 'id');

echo "<pre>";
print_r($result);

output:

Array
(
    [4] => yes
    [5] => no
)

Assuming $data is your starting array, the code below will output what you want in $result

$result = [];
foreach(array_filter($data, function($el){return $el['key']!='parameter';}) as $el){
  $result[$el['id']] = $el['value'];
}

Live demo

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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