You are here

function admin_menu_expand_args in Administration menu 8.3

Same name and namespace in other branches
  1. 7.3 admin_menu.inc \admin_menu_expand_args()

Create the cartesian product of multiple varying sized argument arrays.

Parameters

$arguments: A two dimensional array of arguments.

See also

hook_admin_menu_map()

1 call to admin_menu_expand_args()
admin_menu_merge_tree in ./admin_menu.inc
Walk through the entire menu tree and merge in expanded dynamic menu links.

File

./admin_menu.inc, line 303
Menu builder functions for Administration menu.

Code

function admin_menu_expand_args($arguments) {
  $replacements = [];

  // Initialize line cursors, move out array keys (placeholders) and assign
  // numeric keys instead.
  $i = 0;
  $placeholders = [];
  $new_arguments = [];
  foreach ($arguments as $placeholder => $values) {

    // Skip empty arguments.
    if (empty($values)) {
      continue;
    }
    $cursor[$i] = 0;
    $placeholders[$i] = $placeholder;
    $new_arguments[$i] = $values;
    $i++;
  }
  $arguments = $new_arguments;
  unset($new_arguments);
  if ($rows = count($arguments)) {
    do {

      // Collect current argument from each row.
      $row = [];
      for ($i = 0; $i < $rows; ++$i) {
        $row[$placeholders[$i]] = $arguments[$i][$cursor[$i]];
      }
      $replacements[] = $row;

      // Increment cursor position.
      $j = $rows - 1;
      $cursor[$j]++;
      while (!array_key_exists($cursor[$j], $arguments[$j])) {

        // No more arguments left: reset cursor, go to next line and increment
        // that cursor instead. Repeat until argument found or out of rows.
        $cursor[$j] = 0;
        if (--$j < 0) {

          // We're done.
          break 2;
        }
        $cursor[$j]++;
      }
    } while (1);
  }
  return $replacements;
}