Home > Software design >  How to check the key of next index of arrays in PHP?
How to check the key of next index of arrays in PHP?

Time:04-04

I have an PHP array :

$datas = array(
    "abcd" => array(
        "1639340364" => 1,
        "1639362752" => 85,
        "1639363500" => 74,
    ),
          
    "efgh" => array(
        "1639340364" => 78,
        "1639362754" => 98,
        "1639363500" => 46,
    ),
      
    
    "ijkl" => array(
        "1639340364" => 78,
        "1639362754" => 98,
        "1639363505" => 46,
    ),
);

I want to check the keys of each array and if not match need to add it on every array.

Expecting output like:

$datas = array(
      
    "abcd" => array(
        "1639340364" => 1,
        "1639362752" => 85,
        "1639362754" => 0,
        "1639363500" => 74,
        "1639363505" => 0,
    ),
          
    
    "efgh" => array(
          
        
        "1639340364" => 78,
        "1639362752" => 0,
        "1639362754" => 98,
        "1639363500" => 46,
        "1639363505" => 0,
    ),
      
    
    "ijkl" => array(
        "1639340364" => 78,
        "1639362752" => 0,
        "1639362754" => 98,
        "1639363500" => 0,
        "1639363505" => 46,
    ),
);

If the key is not exist need to add the key with value zero. Is that possible?

I tried with array_key_exists() function... But I'm not sure where I want to check, when I'm checking It's return true(1). I know it's checking on the same array, Actually I want to know where I will check the condition?

foreach($datas as $key => $data ){
  print_r($data);
  foreach($data as $key => $point ){
    $val = array_key_exists($key,$data);
    echo $val;
  }
}

CodePudding user response:

It's not pretty or optimised, but here you go:

$subkeys = array();
foreach ($datas as $k => $d) {
    foreach($d as $k2 => $d2) {
        $subkeys[$k2] = 0;
    }
}
foreach ($datas as $k => &$d) {
    foreach ($subkeys as $xk => $xd) {
        if ( ! array_key_exists($xk, $d)) {
            $d[$xk] = $xd;
        }
    }
}

CodePudding user response:

I came up with this:

// prepare default keys
$keys = [];
foreach ($datas as $data) {
    $keys = array_merge($keys, array_keys($data));
}
$keys = array_unique($keys);
sort($keys);

// construct default array with zeros
$default = array_combine($keys, array_fill(0, count($keys), 0));

// insert the default array
foreach ($datas as $key => $data) {
    $datas[$key] = array_replace($default, $data);
}

// show result
echo '<pre>';
print_r($datas);
echo '</pre>';

I needed used a plethora of array functions. The idea is this: First I gather all the possible 'keys' from the array, make them unique, sort them and combine them into a new 'default' array containing only zero values. After that I use the array_replace() function to insert this array into the existing $datas array. This function does exactly what you want:

array_replace() replaces the values of array with values having the same keys in each of the following arrays. If a key from the first array exists in the second array, its value will be replaced by the value from the second array.

  • Related