배열(Arrays)

PHP에서 배열은 실제로 정렬된 맵입니다. 맵은 값을 키에 연결하는 유형입니다. 이 유형은 여러 가지 용도에 최적화되어 있습니다. 배열, 목록(벡터), 해시 테이블(지도의 구현), 사전, 컬렉션, 스택, 대기열 등으로 취급될 수 있습니다. 배열 값이 다른 배열일 수 있으므로 트리 및 다차원 배열도 가능합니다.

이러한 데이터 구조에 대한 설명은 이 매뉴얼의 범위를 벗어나지만 각각에 대해 최소한 하나의 예가 제공됩니다. 자세한 내용은 이 광범위한 주제에 대해 존재하는 상당한 문헌을 참조하십시오.

구문

array()로 지정하기

array() 언어 구성을 사용하여 배열을 만들 수 있습니다. 쉼표로 구분된 키 => value 쌍을 인수로 사용합니다.

array(
    key  => value,
    key2 => value2,
    key3 => value3,
    ...
)
                

마지막 배열 요소 뒤의 쉼표는 선택 사항이며 생략할 수 있습니다. 이것은 일반적으로 단일 행 배열에 대해 수행됩니다. 즉, array(1, 2)array(1, 2, )보다 선호됩니다. 반면에 여러 줄 배열의 경우 끝에 새 요소를 더 쉽게 추가할 수 있도록 후행 쉼표가 일반적으로 사용됩니다.

메모: array()[]로 바꾸는 짧은 배열 구문이 존재합니다.

예제 # 1 간단한 배열

                  
<?php
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// Using the short array syntax
$array = [
    "foo" => "bar",
    "bar" => "foo",
];
?>
                  
                

키는 int 또는 string일 수 있습니다. 값은 모든 유형이 될 수 있습니다.

또한 다음과 같은 주요 캐스트가 발생합니다.

  • 숫자 앞에 + 기호가 붙지 않는 한 유효한 10진수 정수를 포함하는 문자열은 int 유형으로 캐스트됩니다. 예를 들어 키 "8"은 실제로 8 아래에 저장됩니다. 반면에 "08"은 유효한 십진 정수가 아니므로 캐스팅되지 않습니다.
  • 부동 소수점도 정수로 변환됩니다. 즉, 소수 부분이 잘립니다. 예를 들어 키 8.7은 실제로 8 아래에 저장됩니다.
  • Bool도 int로 캐스팅됩니다. 즉, true 키는 실제로 1 아래에 저장되고 false키는 0 아래에 저장됩니다.
  • Null은 빈 문자열로 캐스팅됩니다. 즉, 키 null은 실제로 "" 아래에 저장됩니다.
  • 배열과 객체는 키로 사용할 수 없습니다. 이렇게 하면 잘못된 오프셋 유형이라는 경고가 표시됩니다.

배열 선언의 여러 요소가 동일한 키를 사용하는 경우 다른 모든 요소를 ​​덮어쓰므로 마지막 요소만 사용됩니다.

예제 #2 타입 캐스팅 및 덮어쓰기 예제

                  
<?php
$array = array(
    1    => "a",
    "1"  => "b",
    1.5  => "c",
    true => "d",
);
var_dump($array);
?>
                  
                

위의 예는 다음을 출력합니다.

array(1) {
  [1]=>
  string(1) "d"
}
                

위의 예에서 모든 키가 1로 캐스트되므로 값은 모든 새 요소에서 덮어쓰여지고 마지막에 할당된 값 "d"만 남게 됩니다.

PHP 배열은 인덱싱된 배열과 연관 배열을 구분하지 않기 때문에 int 및 string 키를 동시에 포함할 수 있습니다.

예제 #3 혼합 int 및 string 키

                  
<?php
$array = array(
    "foo" => "bar",
    "bar" => "foo",
    100   => -100,
    -100  => 100,
);
var_dump($array);
?>
                  
                

위의 예는 다음을 출력합니다.

array(4) {
  ["foo"]=>
  string(3) "bar"
  ["bar"]=>
  string(3) "foo"
  [100]=>
  int(-100)
  [-100]=>
  int(100)
}
                

키는 선택 사항입니다. 지정하지 않으면 PHP는 이전에 사용된 가장 큰 int 키의 증분을 사용합니다.

예제 #4 키가 없는 인덱스 배열

                  
<?php
$array = array("foo", "bar", "hello", "world");
var_dump($array);
?>
                  
                

위의 예는 다음을 출력합니다.

array(4) {
  [0]=>
  string(3) "foo"
  [1]=>
  string(3) "bar"
  [2]=>
  string(5) "hello"
  [3]=>
  string(5) "world"
}
                

일부 요소에 대해서만 키를 지정하고 다른 요소에 대해서는 생략할 수 있습니다.

예제 #5 모든 요소에 없는 키

                  
<?php
$array = array(
         "a",
         "b",
    6 => "c",
         "d",
);
var_dump($array);
?>
                  
                

위의 예는 다음을 출력합니다.

array(4) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [6]=>
  string(1) "c"
  [7]=>
  string(1) "d"
}
                

보시다시피 마지막 값 "d"에는 키 7이 할당되었습니다. 이는 그 이전의 가장 큰 정수 키가 6이기 때문입니다.

예제 #6 복합형 캐스팅 및 덮어쓰기 예제

이 예제에는 키의 유형 캐스팅 및 요소 덮어쓰기의 모든 변형이 포함됩니다.
                  
<?php
$array = array(
    1    => 'a',
    '1'  => 'b', // the value "a" will be overwritten by "b"
    1.5  => 'c', // the value "b" will be overwritten by "c"
    -1 => 'd',
    '01'  => 'e', // as this is not an integer string it will NOT override the key for 1
    '1.5' => 'f', // as this is not an integer string it will NOT override the key for 1
    true => 'g', // the value "c" will be overwritten by "g"
    false => 'h',
    '' => 'i',
    null => 'j', // the value "i" will be overwritten by "j"
    'k', // value "k" is assigned the key 2. This is because the largest integer key before that was 1
    2 => 'l', // the value "k" will be overwritten by "l"
);

var_dump($array);
?>
                  
                

위의 예는 다음을 출력합니다.

array(7) {
  [1]=>
  string(1) "g"
  [-1]=>
  string(1) "d"
  ["01"]=>
  string(1) "e"
  ["1.5"]=>
  string(1) "f"
  [0]=>
  string(1) "h"
  [""]=>
  string(1) "j"
  [2]=>
  string(1) "l"
}
                
대괄호 구문을 사용하여 배열 요소 액세스

배열 요소는 array[key] 구문을 사용하여 액세스할 수 있습니다.

예제 #7 배열 요소 액세스

                  
<?php
$array = array(
    "foo" => "bar",
    42    => 24,
    "multi" => array(
         "dimensional" => array(
             "array" => "foo"
         )
    )
);

var_dump($array["foo"]);
var_dump($array[42]);
var_dump($array["multi"]["dimensional"]["array"]);
?>
                  
                

위의 예는 다음을 출력합니다.

string(3) "bar"
int(24)
string(3) "foo"
                

메모: PHP 8.0.0 이전에는 배열 요소에 액세스하기 위해 대괄호와 중괄호를 서로 바꿔 사용할 수 있었습니다(예: $array[42]$array{42}는 위의 예에서 동일한 작업을 수행함). 중괄호 구문은 PHP 7.4.0부터 더 이상 사용되지 않으며 PHP 8.0.0부터 더 이상 지원되지 않습니다.

예제 #8 배열 역참조

                  
<?php
function getArray() {
    return array(1, 2, 3);
}

$secondElement = getArray()[1];

// or
list(, $secondElement) = getArray();
?>
                  
                

메모: 정의되지 않은 배열 키에 액세스하려는 시도는 정의되지 않은 다른 변수에 액세스하는 것과 동일합니다. E_NOTICE 수준 오류 메시지가 발행되고 결과는 null이 됩니다.

메모: 문자열이 아닌 스칼라 값을 역참조하는 배열은 null을 생성합니다. PHP 7.4.0 이전에는 오류 메시지가 발생하지 않았습니다. PHP 7.4.0부터 이것은 E_NOTICE를 발행합니다. PHP 8.0.0부터 E_WARNING이 발생합니다.

대괄호 구문으로 생성/수정

기존 배열은 명시적으로 값을 설정하여 수정할 수 있습니다.

이것은 배열에 값을 할당하고 대괄호 안에 키를 지정하여 수행됩니다. 키를 생략하면 빈 대괄호([]) 쌍이 생성될 수도 있습니다.

$arr[key] = value;
$arr[] = value;
// key may be an int or string
// value may be any value of any type
                

$arr이 아직 존재하지 않거나 null 또는 false로 설정되어 있으면 생성되므로 배열을 생성하는 대체 방법이기도 합니다. 그러나 $arr에 이미 일부 값(예: 요청 변수의 문자열)이 포함되어 있으면 이 값이 제자리에 유지되고 []가 실제로 문자열 액세스 연산자를 나타낼 수 있기 때문에 이 방법은 권장되지 않습니다. 직접 할당으로 변수를 초기화하는 것이 항상 더 좋습니다.

메모: PHP 7.1.0부터 문자열에 빈 인덱스 연산자를 적용하면 치명적인 오류가 발생합니다. 이전에는 문자열이 자동으로 배열로 변환되었습니다.

메모: PHP 8.1.0부터 false 값으로 새 배열을 만드는 것은 더 이상 사용되지 않습니다. null 및 정의되지 않은 값에서 새 배열을 만드는 것은 여전히 ​​허용됩니다.

특정 값을 변경하려면 키를 사용하여 해당 요소에 새 값을 할당합니다. 키/값 쌍을 제거하려면 그에 대한 unset() 함수를 호출하십시오.

                  
<?php
$arr = array(5 => 1, 12 => 2);

$arr[] = 56;    // This is the same as $arr[13] = 56;
                // at this point of the script

$arr["x"] = 42; // This adds a new element to
                // the array with key "x"

unset($arr[5]); // This removes the element from the array

unset($arr);    // This deletes the whole array
?>
                  
                
메모:

위에서 언급했듯이 키가 지정되지 않으면 기존 int 인덱스의 최대값이 사용되며 새 키는 해당 최대값에 1을 더한 값이 됩니다(그러나 적어도 0). int 인덱스가 아직 존재하지 않으면 키는 0(영)이 됩니다.

이를 위해 사용되는 최대 정수 키는 현재 배열에 존재하지 않아도 됩니다. 마지막으로 배열이 다시 인덱싱된 이후 어느 시점에 배열에 존재해야 합니다. 다음 예는 다음을 보여줍니다.

                    
  <?php
  // Create a simple array.
  $array = array(1, 2, 3, 4, 5);
  print_r($array);

  // Now delete every item, but leave the array itself intact:
  foreach ($array as $i => $value) {
      unset($array[$i]);
  }
  print_r($array);

  // Append an item (note that the new key is 5, instead of 0).
  $array[] = 6;
  print_r($array);

  // Re-index:
  $array = array_values($array);
  $array[] = 7;
  print_r($array);
  ?>
                    
                  

위의 예는 다음을 출력합니다.

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)
Array
(
)
Array
(
    [5] => 6
)
Array
(
    [0] => 6
    [1] => 7
)
                  
유용한 함수

배열 작업에 유용한 함수가 꽤 있습니다. 배열 함수 섹션을 참조하십시오.

메모:

unset() 함수를 사용하면 배열에서 키를 제거할 수 있습니다. 배열은 다시 인덱싱되지 않습니다. 진정한 "제거 및 이동" 동작이 필요한 경우 array_values() 함수를 사용하여 배열을 다시 인덱싱할 수 있습니다.

                    
  <?php
  $a = array(1 => 'one', 2 => 'two', 3 => 'three');
  unset($a[2]);
  /* will produce an array that would have been defined as
     $a = array(1 => 'one', 3 => 'three');
     and NOT
     $a = array(1 => 'one', 2 =>'three');
  */

  $b = array_values($a);
  // Now $b is array(0 => 'one', 1 =>'three')
  ?>
                    
                  

foreach 제어 구조는 특히 배열에 대해 존재합니다. 배열을 순회하는 쉬운 방법을 제공합니다.

Array do's and don'ts

$foo[bar]가 잘못된 이유는 무엇입니까?

항상 문자열 리터럴 배열 인덱스 주위에 따옴표를 사용하십시오. 예를 들어 $foo['bar']는 정확하지만 $foo[bar]는 그렇지 않습니다. 하지만 왜? 이전 스크립트에서 이러한 종류의 구문을 만나는 것은 일반적입니다.

                  
<?php
$foo[bar] = 'enemy';
echo $foo[bar];
// etc
?>
                  
                

이것은 잘못되었지만 작동합니다. 그 이유는 이 코드에 문자열('bar' - 따옴표 참고)이 아닌 정의되지 않은 상수(bar)가 있기 때문입니다. PHP가 자동으로 순수 문자열(알려진 기호에 해당하지 않는 인용 부호 없는 문자열)을 순수 문자열을 포함하는 문자열로 변환하기 때문에 작동합니다. 예를 들어, bar라는 이름의 정의된 상수가 없으면 PHP는 문자열 'bar'를 대체하여 사용합니다.

경고 정의되지 않은 상수를 베어 문자열로 처리하는 폴백은 E_NOTICE 수준의 오류를 발생시킵니다. 이것은 PHP 7.2.0에서 더 이상 사용되지 않으며 레벨 E_WARNING의 오류를 발생시킵니다. PHP 8.0.0부터 제거되었으며 오류 예외가 발생합니다.

참고: 이것은 항상 키를 인용한다는 의미는 아닙니다. 상수변수인 키를 인용하지 마십시오. 이렇게 하면 PHP가 해석하지 못할 수 있습니다.

                    
  <?php
  error_reporting(E_ALL);
  ini_set('display_errors', true);
  ini_set('html_errors', false);
  // Simple array:
  $array = array(1, 2);
  $count = count($array);
  for ($i = 0; $i < $count; $i++) {
      echo "\nChecking $i: \n";
      echo "Bad: " . $array['$i'] . "\n";
      echo "Good: " . $array[$i] . "\n";
      echo "Bad: {$array['$i']}\n";
      echo "Good: {$array[$i]}\n";
  }
  ?>
                    
                  

위의 예는 다음을 출력합니다.

Checking 0:
Notice: Undefined index:  $i in /path/to/script.html on line 9
Bad:
Good: 1
Notice: Undefined index:  $i in /path/to/script.html on line 11
Bad:
Good: 1

Checking 1:
Notice: Undefined index:  $i in /path/to/script.html on line 9
Bad:
Good: 2
Notice: Undefined index:  $i in /path/to/script.html on line 11
Bad:
Good: 2
                  

이 동작을 보여주는 더 많은 예:

                  
<?php
// Show all errors
error_reporting(E_ALL);

$arr = array('fruit' => 'apple', 'veggie' => 'carrot');

// Correct
print $arr['fruit'];  // apple
print $arr['veggie']; // carrot

// Incorrect.  This works but also throws a PHP error of level E_NOTICE because
// of an undefined constant named fruit
//
// Notice: Use of undefined constant fruit - assumed 'fruit' in...
print $arr[fruit];    // apple

// This defines a constant to demonstrate what's going on.  The value 'veggie'
// is assigned to a constant named fruit.
define('fruit', 'veggie');

// Notice the difference now
print $arr['fruit'];  // apple
print $arr[fruit];    // carrot

// The following is okay, as it's inside a string. Constants are not looked for
// within strings, so no E_NOTICE occurs here
print "Hello $arr[fruit]";      // Hello apple

// With one exception: braces surrounding arrays within strings allows constants
// to be interpreted
print "Hello {$arr[fruit]}";    // Hello carrot
print "Hello {$arr['fruit']}";  // Hello apple

// This will not work, and will result in a parse error, such as:
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// This of course applies to using superglobals in strings as well
print "Hello $arr['fruit']";
print "Hello $_GET['foo']";

// Concatenation is another option
print "Hello " . $arr['fruit']; // Hello apple
?>
                  
                

error_reportingE_NOTICE 수준 오류를 표시하도록 설정되면(예: E_ALL로 설정하여) 이러한 사용은 즉시 표시됩니다. 기본적으로 error_reporting은 알림을 표시하지 않도록 설정됩니다.

구문 섹션에서 설명한 대로 대괄호('[' 및 ']') 안에 있는 내용은 표현식이어야 합니다. 이는 다음과 같은 코드가 작동함을 의미합니다.

                  
<?php
echo $arr[somefunc($bar)];
?>
                  
                

함수 반환값을 배열 인덱스로 사용한 예입니다. PHP는 상수에 대해서도 알고 있습니다.

                  
<?php
$error_descriptions[E_ERROR]   = "A fatal error has occurred";
$error_descriptions[E_WARNING] = "PHP issued a warning";
$error_descriptions[E_NOTICE]  = "This is just an informal notice";
?>
                  
                

E_ERROR는 첫 번째 예의 bar와 마찬가지로 유효한 식별자이기도 합니다. 그러나 마지막 예는 실제로 다음과 같이 작성하는 것과 같습니다.

                  
<?php
$error_descriptions[1] = "A fatal error has occurred";
$error_descriptions[2] = "PHP issued a warning";
$error_descriptions[8] = "This is just an informal notice";
?>
                  
                

because E_ERROR equals 1, etc.

그렇다면 왜 나쁜가요?

미래의 어느 시점에서 PHP 팀은 다른 상수나 키워드를 추가하려고 하거나 다른 코드의 상수가 방해할 수 있습니다. 예를 들어, emptydefault라는 단어는 예약어이기 때문에 이런 식으로 사용하는 것은 이미 잘못된 것입니다.

참고: 반복해서 큰 따옴표로 묶인 문자열 내에서 배열 인덱스를 따옴표로 묶지 않는 것이 유효하므로 "$foo[bar]"가 유효합니다. 이유에 대한 자세한 내용과 문자열의 변수 구문 분석에 대한 섹션은 위의 예를 참조하세요.

배열로 변환

int, float, string, bool 및 resource 유형의 경우 값을 배열로 변환하면 인덱스가 0인 단일 요소와 변환된 스칼라 값이 있는 배열이 생성됩니다. 즉, (array)$scalarValuearray($scalarValue)와 정확히 동일합니다.

개체가 배열로 변환되면 결과는 요소가 개체의 속성인 배열입니다. 키는 몇 가지 주목할만한 예외를 제외하고 멤버 변수 이름입니다. 정수 속성은 액세스할 수 없습니다. 개인 변수에는 변수 이름 앞에 클래스 이름이 추가됩니다. 보호된 변수에는 변수 이름 앞에 '*'가 추가됩니다. 이러한 추가 값은 양쪽에 NUL 바이트가 있습니다. 초기화되지 않은 자료형 속성은 자동으로 삭제됩니다.

                  
<?php

class A {
    private $B;
    protected $C;
    public $D;
    function __construct()
    {
        $this->{1} = null;
    }
}

var_export((array) new A());
?>
                  
                

위의 예는 다음을 출력합니다.

array (
  '' . "\0" . 'A' . "\0" . 'B' => NULL,
  '' . "\0" . '*' . "\0" . 'C' => NULL,
  'D' => NULL,
  1 => NULL,
)
                

이러한 NUL은 예기치 않은 동작을 초래할 수 있습니다.

                  
<?php

class A {
    private $A; // This will become '\0A\0A'
}

class B extends A {
    private $A; // This will become '\0B\0A'
    public $AA; // This will become 'AA'
}

var_dump((array) new B());
?>
                  
                

위의 예는 다음을 출력합니다.

array(3) {
  ["BA"]=>
  NULL
  ["AA"]=>
  NULL
  ["AA"]=>
  NULL
}
                

위의 키에는 'AA'라는 두 개의 키가 있는 것처럼 보이지만 실제로는 '\0A\0A'입니다.

null을 배열로 변환하면 빈 배열이 됩니다.

비교

array_diff() 함수 및 배열 연산자를 사용하여 배열을 비교할 수 있습니다.

Examples

PHP의 배열 유형은 매우 다양합니다. 여기 몇 가지 예가 있어요.

                  
<?php
// This:
$a = array( 'color' => 'red',
            'taste' => 'sweet',
            'shape' => 'round',
            'name'  => 'apple',
            4        // key will be 0
          );

$b = array('a', 'b', 'c');

// . . .is completely equivalent with this:
$a = array();
$a['color'] = 'red';
$a['taste'] = 'sweet';
$a['shape'] = 'round';
$a['name']  = 'apple';
$a[]        = 4;        // key will be 0

$b = array();
$b[] = 'a';
$b[] = 'b';
$b[] = 'c';

// After the above code is executed, $a will be the array
// array('color' => 'red', 'taste' => 'sweet', 'shape' => 'round',
// 'name' => 'apple', 0 => 4), and $b will be the array
// array(0 => 'a', 1 => 'b', 2 => 'c'), or simply array('a', 'b', 'c').
?>
                  
                

예제 #9 array() 사용

                  
<?php
// Array as (property-)map
$map = array( 'version'    => 4,
              'OS'         => 'Linux',
              'lang'       => 'english',
              'short_tags' => true
            );

// strictly numerical keys
$array = array( 7,
                8,
                0,
                156,
                -10
              );
// this is the same as array(0 => 7, 1 => 8, ...)

$switching = array(         10, // key = 0
                    5    =>  6,
                    3    =>  7,
                    'a'  =>  4,
                            11, // key = 6 (maximum of integer-indices was 5)
                    '8'  =>  2, // key = 8 (integer!)
                    '02' => 77, // key = '02'
                    0    => 12  // the value 10 will be overwritten by 12
                  );

// empty array
$empty = array();
?>
                  
                

예제 #9 Collection

                  
<?php
$colors = array('red', 'blue', 'green', 'yellow');

foreach ($colors as $color) {
    echo "Do you like $color?\n";
}

?>
                  
                

위의 예는 다음을 출력합니다.

Do you like red?
Do you like blue?
Do you like green?
Do you like yellow?
                

배열의 값을 참조로 전달하여 직접 변경할 수 있습니다.

예제 #11 루프에서 요소 변경

                  
<?php
foreach ($colors as &$color) {
    $color = strtoupper($color);
}
unset($color); /* ensure that following writes to
$color will not modify the last array element */

print_r($colors);
?>
                  
                

위의 예는 다음을 출력합니다.

Array
(
    [0] => RED
    [1] => BLUE
    [2] => GREEN
    [3] => YELLOW
)
                

이 예제에서는 1부터 시작하는 배열을 만듭니다.

예제 #12 One-based index

                  
<?php
$firstquarter  = array(1 => 'January', 'February', 'March');
print_r($firstquarter);
?>
                  
                

위의 예는 다음을 출력합니다.

Array
(
    [1] => 'January'
    [2] => 'February'
    [3] => 'March'
)
                

예제 #13 배열 채우기

                  
<?php
// fill an array with all items from a directory
$handle = opendir('.');
while (false !== ($file = readdir($handle))) {
    $files[] = $file;
}
closedir($handle);
?>
                  
                

배열이 순서정렬됩니다. 다양한 정렬 함수를 사용하여 순서를 변경할 수 있습니다. 자세한 내용은 배열 함수 섹션을 참조하십시오. count() 함수는 배열의 항목 수를 계산하는 데 사용할 수 있습니다.

예제 #14 배열 정렬

                  
<?php
sort($files);
print_r($files);
?>
                  
                

배열의 값은 무엇이든 될 수 있으므로 다른 배열일 수도 있습니다. 이를 통해 재귀 및 다차원 배열을 생성할 수 있습니다.

예제 #15 재귀 및 다차원 배열

                  
<?php
$fruits = array ( "fruits"  => array ( "a" => "orange",
                                       "b" => "banana",
                                       "c" => "apple"
                                     ),
                  "numbers" => array ( 1,
                                       2,
                                       3,
                                       4,
                                       5,
                                       6
                                     ),
                  "holes"   => array (      "first",
                                       5 => "second",
                                            "third"
                                     )
                );

// Some examples to address values in the array above
echo $fruits["holes"][5];    // prints "second"
echo $fruits["fruits"]["a"]; // prints "orange"
unset($fruits["holes"][0]);  // remove "first"

// Create a new multi-dimensional array
$juices["apple"]["green"] = "good";
?>
                  
                

배열 할당에는 항상 값 복사가 포함됩니다. 참조 연산자를 사용하여 참조로 배열을 복사합니다.

                  
<?php
$arr1 = array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 is changed,
             // $arr1 is still array(2, 3)

$arr3 = &$arr1;
$arr3[] = 4; // now $arr1 and $arr3 are the same
?>