Как передать массив в функцию php
Перейти к содержимому

Как передать массив в функцию php

  • автор:

Есть ли способ передать массив, как список аргументов, в функцию?

Она получает, в качестве аргументов, некоторое число массивов, первый из которых содержит данные для сравнения, а второй и последующие проверяются на наличие в них совпадений. Есть игровое поле 10×10 клеток, данные о котором хранятся в соответствующем двухмерном массиве. Мне требуется посчитать, сколько клеток определённого типа есть на всём поле. Функция предполагалась как универсальная, для подсчёта количества совпадений в любом массиве, и переписывать её для проверки массива двухмерного мне не очень хочется. Очевидное решение состоит в том, что бы переписать функцию для получения ею двух массивов, второй из которых будет содержать массивы для проверки, или ввести ещё один обязательный аргумент, содержащий указание глубины погружения, но я не уверен, что это — оптимальный вариант. Поэтому вопрос: Нет ли способа передать все элементы массива в функцию, в качестве независимых аргументов? Есть функция list() , но она просто превратит массив из десяти элементов в десять отдельных переменных, которые всё равно придётся передавать функции вручную, как и если бы я просто перечислил все элементы массива. Хотелось бы что-то более элегантное, тем более, что я почти уверен, что такое решение есть, просто я его не нашёл.

Передача массивов через форму в PHP

Можно объединить несколько элементов формы и получить их на сервере в виде массива. Это делается с помощью манипуляций с атрибутом name .

Так можно передать ассоциативный массив:

При отправке формы содержимое $_GET будет таким:

Array ( [product] => Array ( [name] => Название [article] => Артикул [price] => Цена ) )

Пример обработчика этой формы:

$v) echo «$k : $v
«; // Или обратиться к конкретному полю echo $_GET[‘product’][‘name’]; > ?>

Разумеется, ключами могут быть и обычные числа. А если нужно, чтобы ключи шли по порядку, можно просто ничего не указывать в квадратных скобках:

Содержимое $_GET будет таким:

Array ( [values] => Array ( [0] => Значение 1 [1] => Значение 2 [2] => Значение 3 ) )

Можно передавать и многомерные массивы, например для редактирования сразу нескольких записей в базе данных:

Пример обработчика этой формы:

 $data) < echo "ID: $id, "; echo "Title: $data[title], "; echo "URL: $data[url] 
"; > > ?>

В одной форме можно указывать обычные поля и массивы вместе:

Смотрите также

A simple trick that can help you to guess what diff/intersect or sort function does by name.

[suffix] assoc — additional index check. Compares both value and index.

Example: array_diff_assoc, array_intersect_assoc.

[suffix] key — index only check. Ignores value of array, compares only indexes.

Example: array_diff_key, array_intersect_key.

[suffix] **empty** — no «key» or «assoc» word in suffix. Compares values only. Ignores indexes of array.

Example: array_diff, array_intersect.

[prefix] u — will do comparison with user defined function. Letter u can be used twice in some functions (like array_udiff_uassoc), this means that you have to use 2 functions (one for value, one for index).

Example: array_udiff_uassoc, array_uintersect_assoc.

This also works with array sort functions:

[prefix] a — associative. Will preserve keys.

Example: arsort, asort.

[prefix] k — key sort. Will sort array by keys.

Example: uksort, ksort.

[prefix] r — reverse. Will sort array in reverse order.

Example: rsort, krsort.

[prefix] u — sort by user defined function (same as for diff/intersect).

Example: usort, uasort.

15 years ago

Big arrays use a lot of memory possibly resulting in memory limit errors. You can reduce memory usage on your script by destroying them as soon as you´re done with them. I was able to get over a few megabytes of memory by simply destroying some variables I didn´t use anymore.
You can view the memory usage/gain by using the funcion memory_get_usage(). Hope this helps!

4 years ago

I need to take an element from the Array and change its position within the Array by moving the rest of the elements as required.
This is the function that does it. The first parameter is the working Array. The second is the position of the element to move and the third is the position where to move the element.
The function returns the modified Array.
function array_move_elem ( $array , $from , $to ) if ( $from == $to ) < return $array ; >
$c = count ( $array );
if (( $c > $from ) and ( $c > $to )) if ( $from < $to ) $f = $array [ $from ];
for ( $i = $from ; $i < $to ; $i ++) $array [ $i ] = $array [ $i + 1 ];
>
$array [ $to ] = $f ;
> else $f = $array [ $from ];
for ( $i = $from ; $i > $to ; $i —) $array [ $i ] = $array [ $i — 1 ];
>
$array [ $to ] = $f ;
>

?>
Examples:
$array = array( ‘Cero’ , ‘Uno’ , ‘Dos’ , ‘Tres’ , ‘Cuatro’ , ‘Cinco’ , ‘Seis’ , ‘Siete’ , ‘Ocho’ , ‘Nueve’ , ‘Diez’ );
$array = array_move_elem ( $array , 3 , 5 ); // Move element in position 3 to position 5.
print_r ( $array );

$array = array_move_elem ( $array , 5 , 3 ); // Move element in position 5 to position 3, leaving array as it was. 😉
print_r ( $array );

?>
Return:
Array ( [ 0 ] => Cero [ 1 ] => Uno [ 2 ] => Dos [ 3 ] => Cuatro [ 4 ] => Cinco [ 5 ] => Tres [ 6 ] => Seis [ 7 ] => Siete [ 8 ] => Ocho [ 9 ] => Nueve [ 10 ] => Diez )
Array ( [ 0 ] => Cero [ 1 ] => Uno [ 2 ] => Dos [ 3 ] => Tres [ 4 ] => Cuatro [ 5 ] => Cinco [ 6 ] => Seis [ 7 ] => Siete [ 8 ] => Ocho [ 9 ] => Nueve [ 10 ] => Diez )
?>

8 years ago

/*to change an index without rewriting the whole table and leave at the same place.
*/
function change_index (& $tableau , $old_key , $new_key ) $changed = FALSE ;
$temp = 0 ;
foreach ( $tableau as $key => $value ) switch ( $changed ) case FALSE :
//creates the new key and deletes the old
if ( $key == $old_key ) $tableau [ $new_key ] = $tableau [ $old_key ];
unset( $tableau [ $old_key ]);
$changed = TRUE ;
>
break;

case TRUE :
//moves following keys
if ( $key != $new_key ) $temp = $tableau [ $key ];
unset( $tableau [ $key ]);
$tableau [ $key ] = $temp ;
break;
>
else < $changed = FALSE ;>//stop
>
>
array_values ( $tableau ); //free_memory
>

//Result :
$tableau = array( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 );
$res = print_r ( $tableau , TRUE );
$longueur = strlen ( $res ) — 1 ;
echo «Old array :\n» . substr ( $res , 8 , $longueur ) . «\n» ;

change_index ( $tableau , 2 , ‘number 2’ );
$res = print_r ( $tableau , TRUE );
$longueur = strlen ( $res ) — 10 ;
echo «New array :\n» . substr ( $res , 8 , $longueur ) . «\n» ;

3 years ago

Updated code of ‘indioeuropeo’ with option to input string-based keys.

FUNCTION:
function array_move_elem ( $array , $from , $to ) // return if non-numeric couldn’t be found or from=to
if(! is_numeric ( $from )) if( array_search ( $from , array_keys ( $array ))!== FALSE ) $from = array_search ( $from , array_keys ( $array ));
>else return $array ;
>
>
$array_numeric_keys = array();
foreach( $array as $k => $v ) $array_numeric_keys [] = $k ;
>
if ( $from == $to ) < return $array ; >
$c = count ( $array_numeric_keys );
if (( $c > $from ) and ( $c > $to )) if ( $from < $to ) $f = $array_numeric_keys [ $from ];
for ( $i = $from ; $i < $to ; $i ++) $array_numeric_keys [ $i ] = $array_numeric_keys [ $i + 1 ];
>
$array_numeric_keys [ $to ] = $f ;
> else $f = $array_numeric_keys [ $from ];
for ( $i = $from ; $i > $to ; $i —) $array_numeric_keys [ $i ] = $array_numeric_keys [ $i — 1 ];
>
$array_numeric_keys [ $to ] = $f ;
>

>
$array_new = array();
foreach( $array_numeric_keys as $v ) $array_new [ $v ] = $array [ $v ];
>
return $array_new ;
>
?>

17 years ago

Here is a function to find out the maximum depth of a multidimensional array.

// return depth of given array
// if Array is a string ArrayDepth() will return 0
// usage: int ArrayDepth(array Array)

function ArrayDepth ( $Array , $DepthCount =- 1 , $DepthArray =array()) $DepthCount ++;
if ( is_array ( $Array ))
foreach ( $Array as $Key => $Value )
$DepthArray []= ArrayDepth ( $Value , $DepthCount );
else
return $DepthCount ;
foreach( $DepthArray as $Value )
$Depth = $Value > $Depth ? $Value : $Depth ;
return $Depth ;
>
?>

11 years ago

Short function for making a recursive array copy while cloning objects on the way.

function arrayCopy ( array $array ) $result = array();
foreach( $array as $key => $val ) if( is_array ( $val ) ) $result [ $key ] = arrayCopy ( $val );
> elseif ( is_object ( $val ) ) $result [ $key ] = clone $val ;
> else $result [ $key ] = $val ;
>
>
return $result ;
>
?>

6 years ago

While there are a lot of array functions in the PHP libs, there also seem to be a lot of rudimentary ones missing.

I went ahead and created several of my own functions for handling multiple non-associative (na) arrays including:

If you are using Venn diagrams to think about your arrays, then these functions might be for you.

12 years ago

While PHP has well over three-score array functions, array_rotate is strangely missing as of PHP 5.3. Searching online offered several solutions, but the ones I found have defects such as inefficiently looping through the array or ignoring keys.

The following array_rotate() function uses array_merge and array_shift to reliably rotate an array forwards or backwards, preserving keys. If you know you can trust your $array to be an array and $shift to be between 0 and the length of your array, you can skip the function definition and use just the return expression in your code.

function array_rotate ( $array , $shift ) if(! is_array ( $array ) || ! is_numeric ( $shift )) if(! is_array ( $array )) error_log ( __FUNCTION__ . ‘ expects first argument to be array; ‘ . gettype ( $array ). ‘ received.’ );
if(! is_numeric ( $shift )) error_log ( __FUNCTION__ . ‘ expects second argument to be numeric; ‘ . gettype ( $shift ). » ` $shift ` received.» );
return $array ;
>
$shift %= count ( $array ); //we won’t try to shift more than one array length
if( $shift < 0 ) $shift += count ( $array ); //handle negative shifts as positive
return array_merge ( array_slice ( $array , $shift , NULL , true ), array_slice ( $array , 0 , $shift , true ));
>
?>
A few simple tests:
$array =array( «foo» => 1 , «bar» => 2 , «baz» => 3 , 4 , 5 );

print_r ( array_rotate ( $array , 2 ));
print_r ( array_rotate ( $array , — 2 ));
print_r ( array_rotate ( $array , count ( $array )));
print_r ( array_rotate ( $array , «4» ));
print_r ( array_rotate ( $array , — 9 ));
?>

7 years ago

I was looking for an array aggregation function here and ended up writing this one.

Note: This implementation assumes that none of the fields you’re aggregating on contain The ‘@’ symbol.

function array_group_by ( $flds , $arr ) $groups = array();
foreach ( $arr as $rec ) $keys = array_map (function( $f ) use( $rec ) < return $rec [ $f ]; >, $flds );
$k = implode ( ‘@’ , $keys );
if (isset( $groups [ $k ])) $groups [ $k ][] = $rec ;
> else $groups [ $k ] = array( $rec );
>
>
return $groups ;
>

14 years ago

Function to pretty print arrays and objects. Detects object recursion and allows setting a maximum depth. Based on arraytostring and u_print_r from the print_r function notes. Should be called like so:

egvaluetostring ( $value ) //no max depth, or
egvaluetostring ( $value , $max_depth ) //max depth set

function egvaluetostring ( $value , $max_depth , $key = NULL , $depth = 0 , $refChain = array()) <
if( $depth > 0 )
$tab = str_repeat ( «\t» , $depth );
$text .= $tab . ( $key !== NULL ? $key . » => » : «» );

if ( is_array ( $value ) || is_object ( $value )) <
$recursion = FALSE ;
if ( is_object ( $value )) <
foreach ( $refChain as $refVal ) <
if ( $refVal === $value ) <
$recursion = TRUE ;
break;
>
>
array_push ( $refChain , $value );
>

$text .= ( is_array ( $value ) ? «array» : «object» ) . » ( » ;

if ( $recursion ) <
$text .= «*RECURSION* » ;
>
elseif (isset( $max_depth ) && $depth >= $max_depth ) <
$text .= «*MAX DEPTH REACHED* » ;
>
else <
if (!empty( $value )) <
$text .= «\n» ;
foreach ( $value as $child_key => $child_value ) <
$text .= egvaluetostring ( $child_value , $max_depth , ( is_array ( $value ) ? «[» : «» ) . $child_key . ( is_array ( $value ) ? «]» : «» ), $depth + 1 , $refChain ) . «,\n» ;
>
$text .= «\n» . $tab ;
>
>

if ( is_object ( $value )) <
array_pop ( $refChain );
>
>
else <
$text .= » $value » ;
>

implode

Альтернативная сигнатура (не поддерживается с именованными аргументами):

implode ( array $array ): string

Устаревшая сигнатура (устарела с PHP 7.4.0, удалена в PHP 8.0.0):

implode ( array $array , string $separator ): string

Функция присоединяет элементы массива через строку-разделитель separator .

Список параметров

Необязательный. По умолчанию равен пустой строке.

Массив объединяемых строк.

Возвращаемые значения

Функция возвращает строку, которая содержит строковое представление элементов массива в том же порядке, со строкой-разделителем между каждым элементом.

Список изменений

Версия Описание
8.0.0 Функция больше не поддерживает передачу разделителя separator после массива array .
7.4.0 Передача разделителя separator после массива array , т. е. сигнатура, которая досталась в наследство, устарела.

Примеры

Пример #1 Пример использования функции implode()

$array = [ ‘имя’ , ‘почта’ , ‘телефон’ ];
var_dump ( implode ( «,» , $array )); // string(32) «имя,почта,телефон»

// Пустая строка при использовании пустого массива:
var_dump ( implode ( ‘привет’ , [])); // string(0) «»

// Параметр separator не обязателен:
var_dump ( implode ([ ‘a’ , ‘b’ , ‘c’ ])); // string(3) «abc»

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • explode() — Разбивает строку разделителем
  • preg_split() — Разбивает строку по регулярному выражению
  • http_build_query() — Генерирует URL-кодированную строку запроса

Improve This Page

User Contributed Notes 14 notes

15 years ago

it should be noted that an array with one or no elements works fine. for example:

$a1 = array( «1» , «2» , «3» );
$a2 = array( «a» );
$a3 = array();

echo «a1 is: ‘» . implode ( «‘,'» , $a1 ). «‘
» ;
echo «a2 is: ‘» . implode ( «‘,'» , $a2 ). «‘
» ;
echo «a3 is: ‘» . implode ( «‘,'» , $a3 ). «‘
» ;
?>

will produce:
===========
a1 is: ‘1’,’2′,’3′
a2 is: ‘a’
a3 is: »

5 years ago

It’s not obvious from the samples, if/how associative arrays are handled. The «implode» function acts on the array «values», disregarding any keys:

declare( strict_types = 1 );

$a = array( ‘one’ , ‘two’ , ‘three’ );
$b = array( ‘1st’ => ‘four’ , ‘five’ , ‘3rd’ => ‘six’ );

echo implode ( ‘,’ , $a ), ‘/’ , implode ( ‘,’ , $b );
?>

outputs:
one,two,three/four,five,six

11 years ago

Can also be used for building tags or complex lists, like the following:

$elements = array( ‘a’ , ‘b’ , ‘c’ );

  • » . implode ( «
  • » , $elements ) . «

?>

This is just an example, you can create a lot more just finding the right glue! 😉

7 years ago

It might be worthwhile noting that the array supplied to implode() can contain objects, provided the objects implement the __toString() method.

class Foo
protected $title ;

public function __construct ( $title )
$this -> title = $title ;
>

public function __toString ()
return $this -> title ;
>
>

$array = [
new Foo ( ‘foo’ ),
new Foo ( ‘bar’ ),
new Foo ( ‘qux’ )
];

echo implode ( ‘; ‘ , $array );
?>

will output:

12 years ago

If you want to implode an array of booleans, you will get a strange result:
var_dump ( implode ( » ,array( true , true , false , false , true )));
?>

Output:
string(3) «111»

TRUE became «1», FALSE became nothing.

3 years ago

Sometimes it’s necessary to add a string not just between the items, but before or after too, and proper handling of zero items is also needed.
In this case, simply prepending/appending the separator next to implode() is not enough, so I made this little helper function.

function wrap_implode ( $array , $before = » , $after = » , $separator = » ) if( ! $array ) return » ;
return $before . implode ( » < $after >< $separator > < $before >» , $array ) . $after ;
>

echo wrap_implode ([ ‘path’ , ‘to’ , ‘file.php’ ], ‘/’ );
// «/path/to/file.php»

$pattern = ‘#’ . wrap_implode ([ 4 , 2 , 2 ], ‘\d’ , ‘[-.]’ ) . ‘#’ ;
echo $pattern , «\n» ; // #\d[-.]\d[-.]\d#
echo preg_replace ( $pattern , ‘[REDACTED]’ , ‘The UFO appeared between 2012-12-24 and 2013.01.06 every night.’ );
// ‘The UFO appeared between [REDACTED] and [REDACTED] every night.

echo wrap_implode ([ ‘line’ , ‘by’ , ‘line’ ], ‘‘ , ‘‘ , ‘
‘ );
// line
by
line

4 years ago

If you want to implode an array as key-value pairs, this method comes in handy.
The third parameter is the symbol to be used between key and value.

function mapped_implode ( $glue , $array , $symbol = ‘=’ ) return implode ( $glue , array_map (
function( $k , $v ) use( $symbol ) <
return $k . $symbol . $v ;
>,
array_keys ( $array ),
array_values ( $array )
)
);
>

echo mapped_implode ( ‘, ‘ , $arr , ‘ is ‘ );

// output: x is 5, y is 7, z is 99, hello is World, 7 is Foo

11 years ago

It may be worth noting that if you accidentally call implode on a string rather than an array, you do NOT get your string back, you get NULL:
var_dump ( implode ( ‘:’ , ‘xxxxx’ ));
?>
returns
NULL

This threw me for a little while.

11 years ago

Even handier if you use the following:

$id_nums = array( 1 , 6 , 12 , 18 , 24 );

$id_nums = implode ( «, » , $id_nums );

$sqlquery = «Select name,email,phone from usertable where user_id IN ( $id_nums )» ;

// $sqlquery becomes «Select name,email,phone from usertable where user_id IN (1,6,12,18,24)»
?>

Be sure to escape/sanitize/use prepared statements if you get the ids from users.

8 years ago

null values are imploded too. You can use array_filter() to sort out null values.

$ar = array( «hello» , null , «world» );
print( implode ( ‘,’ , $ar )); // hello,,world
print( implode ( ‘,’ , array_filter ( $ar , function( $v )< return $v !== null ; >))); // hello,world
?>

4 years ago

If you want to use a key inside array:

Example:
$arr=array(
array(«id» => 1,»name» => «Test1»),
array(«id» => 2,»name» => «Test2»),
);

echo implode_key(«,»,$arr, «name»);
OUTPUT: Test1, Test2

function implode_key($glue, $arr, $key) $arr2=array();
foreach($arr as $f) if(!isset($f[$key])) continue;
$arr2[]=$f[$key];
>
return implode($glue, $arr2);
>

6 years ago

It is possible for an array to have numeric values, as well as string values. Implode will convert all numeric array elements to strings.

$test = implode ([ «one» , 2 , 3 , «four» , 5.67 ]);
echo $test ;
//outputs: «one23four5.67»
?>

2 years ago

There is no mention of behavior on a empty array, so I tried it and here’s the result:

$ar = array();
$result = implode ( ‘,’ , $ar ); // Comma arbitrarily applied as the separator
$is_result_empty = empty( $result );
?>

$result:
$is_result_empty: 1

In other words, an empty string is the result.

3 years ago

* Join pieces with a string recursively .
*
* @ param mixed $glue String between pairs ( glue ) or an array pair ‘s glue and key/value glue or $pieces.
* @param iterable $pieces Pieces to implode (optional).
* @return string Joined string
*/
function double_implode($glue, iterable $pieces = null): string
$glue2 = null;
if ($pieces === null) $pieces = $glue;
$glue = »;
> elseif (is_array($glue)) list($glue, $glue2) = $glue;
>

$result = [];
foreach ($pieces as $key => $value) $result[] = $glue2 === null ? $value : $key . $glue2 . $value;
>
return implode($glue, $result);
>
?>
Examples:
$array = [‘ a ‘ => 1, ‘b’ => 2];
$str = implode($array);
$str = implode(‘ , ‘, $array);
$str = implode([‘» ‘, ‘ keyword»>, ‘, $iterator);
$str = implode([‘» ‘, ‘ foot»>+add a note

  • Copyright © 2001-2024 The PHP Group
  • My PHP.net
  • Contact
  • Other PHP.net sites
  • Privacy policy

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *