Jump to content

Archived

This topic is now archived and is closed to further replies.

lindm

[SOLVED] Manipulate array (remove certain keys and renaming keys)

Recommended Posts

I have the following array:

 

$array = array( 
'FIGURE1cy'=>100, 
'FIGURE1py'=>100, 
'FIGURE2cy'=>100, 
'FIGURE2py'=>100 ,
'somethingelse'=>hello,
'somethingelse2'=>hello2

etc
etc
);

 

I am looking for two ways to manipulate this array:

1. Remove all elements where the key ends with cy. I could use unset but there must be a simpler way since the array is fairly large. Some way to iterate through the array with unset??

 

2. Perform number 1 and change the name of all keys ending with cy to py.

 

Any help appreciated.

Share this post


Link to post
Share on other sites

Looping through the array and using unset is probably the easiest method, but array_walk() provides you with an alternative.

<?php

$array = array( 'FIGURE1cy'      => 100,
                'FIGURE1py'      => 100,
                'FIGURE2cy'      => 100,
                'FIGURE2py'      => 100 ,
                'somethingelse'  => 'hello',
                'somethingelse2' => 'hello2'
);


function arrayWalkFunc($item1, $key, $array) {
if (substr($key,-2) == 'cy') {
	unset($array[$key]);
}
}

array_walk($array,'arrayWalkFunc',&$array);

echo '<pre>';
print_r($array);
echo '</pre>';

?>

Share this post


Link to post
Share on other sites

Thanks!

 

Any suggestion if I want to rename all keys ending with cy to py?

Share this post


Link to post
Share on other sites
Any suggestion if I want to rename all keys ending with cy to py?

You could use the same basic technique.

 

However, that would cause problems with your test array, where you already have a key ending in 'py' that matches one of the 'cy' keys that you want to rename.

 

<?php

$array = array( 'FIGURE1cy'      => 100,
                'FIGURE1py'      => 100,
                'FIGURE2cy'      => 100,
                'FIGURE2py'      => 100 ,
                'somethingelse'  => 'hello',
                'somethingelse2' => 'hello2'
);


function arrayWalkFunc($item1, $key, $array) {
if (substr($key,-2) == 'cy') {
	$newkey = substr($key,0,-2).'py';
	unset($array[$key]);
	$array[$newkey] = $item1;
}
}

array_walk($array,'arrayWalkFunc',&$array);

echo '<pre>';
print_r($array);
echo '</pre>';

?>

 

And again, a straight loop would be a better approach.

Share this post


Link to post
Share on other sites

Just one problem

 

Users may not change the array itself from the callback function. e.g. Add/delete elements' date=' unset elements, etc. [/quote']

Share this post


Link to post
Share on other sites

Just one problem

 

Users may not change the array itself from the callback function. e.g. Add/delete elements' date=' unset elements, etc. [/quote']

Except my examples actually work because I'm explicitly passing the third parameter to array_walk() by reference;

Share this post


Link to post
Share on other sites

Would it be possible to use array_map and unset somehow?

$array=$_POST;


function remove($item) {
if (substr($item,-2) == 'py') {
	unset($item);
}
}



$b = array_map("remove", $_POST);

echo json_encode($b);

 

 

Share this post


Link to post
Share on other sites

function remove(&$item) {
  foreach ($item as $key => $val) {
       if (substr($key,-2) == 'py') {
           unset($item[$key]);
       }
  }
}



$b = array_map("remove", $_POST);

echo json_encode($b);

 

I think that would work. You have to pass it by reference from what I remember....

Share this post


Link to post
Share on other sites

Tried this:

$array = array( 
'FIGURE1cy'=>100, 
'FIGURE1py'=>100, 
'FIGURE2cy'=>100, 
'FIGURE2py'=>100 ,
'somethingelse'=>hello,
'somethingelse2'=>hello2
);


function remove(&$item) {
  foreach ($item as $key => $val) {
       if (substr($key,-2) == 'py') {
           unset($item[$key]);
       }
  }
}



$b = array_map("remove", $array);

echo json_encode($b);

 

But get the error:

Warning: Invalid argument supplied for foreach() in /Library/WebServer/Documents/htdocs/phptest2/script/jsonnewyear.php on line 21

Warning: Invalid argument supplied for foreach() in /Library/WebServer/Documents/htdocs/phptest2/script/jsonnewyear.php on line 21

Warning: Invalid argument supplied for foreach() in /Library/WebServer/Documents/htdocs/phptest2/script/jsonnewyear.php on line 21

Warning: Invalid argument supplied for foreach() in /Library/WebServer/Documents/htdocs/phptest2/script/jsonnewyear.php on line 21

Warning: Invalid argument supplied for foreach() in /Library/WebServer/Documents/htdocs/phptest2/script/jsonnewyear.php on line 21

Warning: Invalid argument supplied for foreach() in /Library/WebServer/Documents/htdocs/phptest2/script/jsonnewyear.php on line 21
{"FIGURE1cy":null,"FIGURE1py":null,"FIGURE2cy":null,"FIGURE2py":null,"somethingelse":null,"somethingelse2":null}

 

 

Share this post


Link to post
Share on other sites

function remove($item) {
  if (is_array($item)) {
     foreach ($item as $key => $val) {
          if (substr($key,-2) == 'py') {
             unset($item[$key]);
         }
     }
      return $item; 
  }
}


$b = remove($_POST);


echo json_encode($b);

 

Should work as long as $_POST is an array, so make sure you are posting data.

Share this post


Link to post
Share on other sites

Seems to work! Now I have a follow up for another function...

 

I want to rename all keys ending with "cy" to "py". So

 

$array = array( 
'FIGURE1cy'=>100, 
'FIGURE2cy'=>100, 
'somethingelse'=>hello,
'somethingelse2'=>hello2
);

 

would become

 

$array = array( 
'FIGURE1py'=>100, 
'FIGURE2py'=>100, 
'somethingelse'=>hello,
'somethingelse2'=>hello2
);

 

My code so far (based on your code above):

 

function rename($item) {
  if (is_array($item)) {
     foreach ($item as $key => $val) {
          if (substr($key,-2) == 'cy') {
             XXXXXX
         }
     }
      return $item; 
  }
}




$b = rename($array);

echo json_encode($b);

 

Not sure about the XXXX or if this is the best way to handle the problem?

Share this post


Link to post
Share on other sites
function rename($item) {
  if (is_array($item)) {
     foreach ($item as $key => $val) {
          if (substr($key,-2) == 'cy') {
             $key = str_replace("cy", "py", $key);
             $item[$key] = $val;
         }
     }
      return $item;
  }
}


$b = rename($array);

echo json_encode($b);

Share this post


Link to post
Share on other sites

When testing:

$array = array( 
'FIGURE1cy'=>100, 
'FIGURE2cy'=>100, 
'somethingelse'=>hello,
'somethingelse2'=>hello2
);

function rename($item) {
  if (is_array($item)) {
     foreach ($item as $key => $val) {
          if (substr($key,-2) == 'cy') {
             $key = str_replace("cy", "py", $key);
             $item[$key] = $val;
         }
     }
      return $item;
  }
}


$b = rename($array);

echo json_encode($b);

 

Gives the following error:

Fatal error: Cannot redeclare rename() in /Library/WebServer/Documents/htdocs/phptest2/script/jsonnewyear.php on line 36

 

Share this post


Link to post
Share on other sites

You have the function defined somewhere else. Comment out the old function or rename that one to replace or something like that

Share this post


Link to post
Share on other sites

Excellent! rename is of course an already built in function so I can't use that name.

 

Many thanks for the help!

Share this post


Link to post
Share on other sites

Had a final follow up of course...

 

If I want to change the value of all keys ending with py to zero how should I do then (see xxx below):

 

function ny($item) {
  if (is_array($item)) {
     foreach ($item as $key => $val) {
          if (substr($key,-2) == 'py') {
             xxx
         }
     }
      return $item;
  }
}

 

Share this post


Link to post
Share on other sites

Had a final follow up of course...

 

If I want to change the value of all keys ending with py to zero how should I do then (see xxx below):

 

function ny($item) {
  if (is_array($item)) {
     foreach ($item as $key => $val) {
          if (substr($key,-2) == 'py') {
             xxx
         }
     }
      return $item;
  }
}

 

 

You cant figure that out given the code prior....wow. No offense but I would of hoped you could do that by now by looking at prior code and just basics of php arrays. I would read up on arrays if you are going to be using them alot and learn how they work.

 

function ny($item) {
  if (is_array($item)) {
     foreach ($item as $key => $val) {
          if (substr($key,-2) == 'py') {
             $item[$key] = 0;
         }
     }
      return $item;
  }
}

Share this post


Link to post
Share on other sites

Thank you for the patience, I am fairly new to arrays, loops etc. One strange thing with the code gathered so far (example below):

$array = array( 
'FIGURE1cy'=>10, 
'FIGURE2cy'=>20,
'FIGURE1py'=>30, 
'FIGURE2py'=>40, 
'somethingelse'=>hello,
'somethingelse2'=>hello2
);

function ny($item) {
  if (is_array($item)) {
     foreach ($item as $key => $val) {
     	if (substr($key,-2) == 'py') {
             $item[$key] = 0;
         }
        if (substr($key,-2) == 'cy') {
             $key = str_replace("cy", "py", $key);
             $item[$key] = $val;
         }
	if (substr($key,-2) == 'py') {
             $key = str_replace("py", "cy", $key);
             $item[$key] = $val;
         } 


     }
      return $item;
  }
}

$b = ny($array);

echo json_encode($b);

 

This returns the following:

{"FIGURE1cy":30,"FIGURE2cy":40,"FIGURE1py":0,"FIGURE2py":0,"somethingelse":"hello","somethingelse2":"hello2"}

 

I was hoping it would have been:

{"FIGURE1cy":0,"FIGURE2cy":0,"FIGURE1py":10,"FIGURE2py":20,"somethingelse":"hello","somethingelse2":"hello2"}

 

The goal is to change this array:

$array = array( 
'FIGURE1cy'=>10, 
'FIGURE2cy'=>20,
'FIGURE1py'=>30, 
'FIGURE2py'=>40, 
'somethingelse'=>hello,
'somethingelse2'=>hello2
);

to

$array = array( 
'FIGURE1cy'=>0, 
'FIGURE2cy'=>0,
'FIGURE1py'=>10, 
'FIGURE2py'=>20, 
'somethingelse'=>hello,
'somethingelse2'=>hello2
);

 

Share this post


Link to post
Share on other sites

The 3rd if is overwriting the 0, cause py is being checked again and assigning it $val.

 

Try this:

function ny($item) {
  if (is_array($item)) {
     foreach ($item as $key => $val) {
        if (substr($key,-2) == 'py') {
              $val = 0;
         }
        if (substr($key,-2) == 'cy') {
             $key = str_replace("cy", "py", $key);
             $item[$key] = $val;
         }
      if (substr($key,-2) == 'py') {
             $key = str_replace("py", "cy", $key);
             $item[$key] = $val;
         }
      
      
     }
      return $item;
  }
}

 

Should work like you want it to.

Share this post


Link to post
Share on other sites

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.