찾다
백엔드 개발PHP 튜토리얼PHP 배열 함수를 현명하게 사용하는 방법

0x00 서문

PHP의 배열은 매우 강력한 데이터 유형입니다. 동시에 PHP에는 일상적인 개발 기능을 쉽게 구현할 수 있는 일련의 배열 관련 기능이 내장되어 있습니다. 그런데 많은 친구들이 내장 함수의 역할을 무시하고 있는 것 같습니다. (예를 들어 배열 연산과 관련된 코드를 작성했는데 PHP가 함께 제공된다는 것을 알았습니다~~. PHP 내장 함수 활용하기 개발 효율성과 운영 효율성을 크게 향상시킬 수 있습니다(내장 함수는 C로 작성되었으며 PHP로 작성된 것보다 훨씬 효율적입니다). 따라서 이 기사에서는 일반적인 시나리오에서 PHP 내장 함수를 사용하는 몇 가지 구현 방법을 요약합니다. , PHP 배열 기능에 대해 더 자세히 알고 싶다면 PHP 매뉴얼을 확인하는 것이 좋습니다.

관련 학습 권장 사항:

PHP 비디오 튜토리얼: https://www.php.cn/course/list/ 29/type/2.html

0x01 지정된 키 이름을 가져옵니다

일부 연관 배열의 경우 때로는 지정된 키 이름의 일부만 가져오고 싶을 때가 있습니다. 예를 들어 배열은 ['id'입니다. => 1, 'name' => 'zane', 'password' => '123456'] ID와 이름이 포함된 부분만 가져오려면 어떻게 해야 합니까?

당연하게도 매우 간단합니다! 그런데 여기서 array_intersect_key와 array_flip은 무엇인가요? 이 두 함수의 기능을 간단히 소개하자면, 첫 번째로 이 함수의 기능은 "배열의 키와 값을 바꾸는 것"입니다. " 즉, 키 이름이 값이 되고, 그 값은 우리가 전달한 키 이름이 됩니다. 매개변수는 [0 => 'id', 1 => 'name']에서 ['id' => 0으로 변환됩니다. , 'name' => 1] 이 함수를 통해 array_intersect_key 함수를 제공하기 위해 array_intersect_key 함수의 기능은 "배열의 교차점을 계산하기 위해 키 이름 비교를 사용하는 것"입니다. 다른 매개변수 배열과 동일한 키 이름을 가진 첫 번째 매개변수 배열의 값을 반환합니다. 이는 지정된 키 이름을 사용하는 목적을 달성합니다. 이 두 함수를 사용하려면 PHP 공식 매뉴얼을 확인해야 합니다. array_flip array_intersect_key

0x02 지정된 키 이름을 제거하세요

이전 예를 시작점으로 이에 대해 간단히 이야기해 보겠습니다.

<?php
$raw = [&#39;id&#39; => 1, &#39;name&#39; => &#39;zane&#39;, &#39;password&#39; => &#39;123456&#39;];
// 自己用 PHP 实现
function onlyKeys($raw, $keys) {
    $new = [];
    foreach ($raw as $key => $val) {
        if (in_array($key, $keys)) {
            $new[$key] = $val;
        }
    }
    
    return $new;
}
// 用 PHP 内置函数实现
function newOnlyKeys($array, $keys) {
    return array_intersect_key($array, array_flip($keys));
}
var_dump(onlyKeys($raw, [&#39;id&#39;, &#39;name&#39;]));
// 结果 [&#39;id&#39; => 1, &#39;name&#39; => &#39;zane&#39;]
var_dump(newOnlyKeys($raw, [&#39;id&#39;, &#39;name&#39;]));
// 结果 [&#39;id&#39; => 1, &#39;name&#39; => &#39;zane&#39;]
.

이전 예와 비교하면 이 예에서는 array_intersect_key 함수를 array_diff_key로 변경한 것뿐입니다. 음... "키 이름을 사용하여 배열 비교"라는 함수의 기능을 짐작할 수 있을 것입니다. array_intersect_key의 함수 공식 매뉴얼: array_diff_key

0x03 Array deduplication

저는 모든 사람이 이 기능을 필요로 한다고 생각합니다. 물론, PHP에는 다음 예와 같이 모든 사람이 사용할 수 있는 array_unique 함수가 내장되어 있습니다. 안녕하세요, 대부분의 문제는 이 함수로 해결될 수 있지만 때로는 다음과 같은 이유로 충분히 빠르지 않다고 느낄 수도 있습니다:

array_unique()는 먼저 값을 문자열로 정렬한 다음 첫 번째 값만 유지합니다. 각 값에 대한 값 발견된 키 이름은 무시되고 이후의 모든 키 이름이 무시됩니다.

이 기능은 배열을 먼저 정렬하기 때문에 일부 시나리오에서는 속도가 예상 요구 사항을 충족하지 못할 수 있습니다.

이제 우리는 블랙 기술 array_flip 함수를 사용할 수 있습니다. 우리 모두 알고 있듯이 PHP 배열의 키 이름은 고유하므로 키 이름과 값이 교체된 후에는 중복 값이 ​​무시됩니다. array_flip 함수를 연속해서 두 번 호출한다고 상상해 보세요. array_unique 함수의 기능을 구현하는 것과 동일할까요? 샘플 코드는 다음과 같습니다.

<?php
$raw = [&#39;id&#39; => 1, &#39;name&#39; => &#39;zane&#39;, &#39;password&#39; => &#39;123456&#39;];
// 用 PHP 内置函数实现
function removeKeys($array, $keys) {
    return array_diff_key($array, array_flip($keys));
}
// 移除 id 键
var_dump(removeKeys($raw, [&#39;id&#39;, &#39;password&#39;]));
// 结果 [&#39;name&#39; => &#39;zane&#39;]

Huh? ! 결과는 array_unique와 다릅니다! 이유는 PHP 공식 매뉴얼에서 답을 얻을 수 있습니다.

동일한 값이 여러 번 나타나면 마지막 키 이름이 해당 값으로 사용되고 다른 키는 삭제됩니다.

일반적으로 array_unique는 나타나는 첫 번째 키 이름을 유지하고 array_flip은 나타나는 마지막 키 이름을 유지합니다.

참고: array_flip을 배열 중복 제거로 사용하는 경우 배열의 값을 키 이름(즉, 문자열 유형 또는 정수 유형)으로 사용할 수 있어야 하며, 그렇지 않으면 값이 무시됩니다.

그리고 키 이름을 유지할 필요가 없다면 이렇게 array_values(array_flip($input)) 을 직접 사용할 수도 있습니다.

0x04 인덱스 재설정

배열과 같이 비연속 인덱스가 있는 배열을 재설정하려는 경우: [0 => 233, 99 => 666], 이러한 종류의 배열에 대해서만 호출해야 합니다. 이를 달성하기 위해 array_values ​​​​함수를 사용합니다. 예를 들면:

<?php
$input = [&#39;you are&#39; => 666, &#39;i am&#39; => 233, &#39;he is&#39; => 233, &#39;she is&#39; => 666];
$result = array_unique($input);
var_dump($result);
// 结果 [&#39;you are&#39; => 666, &#39;i am&#39; => 233]
array_values ​​함수는 숫자 인덱스를 재설정할 뿐만 아니라 문자열 키 이름을 삭제하고 재설정한다는 점에 유의해야 합니다. 그렇다면 문자열 키 이름을 유지하면서 숫자 인덱스를 어떻게 재설정합니까? 대답은 array_slice 함수입니다. 코드 예제는 다음과 같습니다.

<?php
$input = [&#39;you are&#39; => 666, &#39;i am&#39; => 233, &#39;he is&#39; => 233, &#39;she is&#39; => 666];
$result = array_flip(array_flip($input));
var_dump($result);
// 结果 [&#39;she is&#39; => 666, &#39;he is&#39; => 233]

array_slice 함수는 배열의 세그먼트를 꺼내는 것이지만 기본적으로 배열의 숫자 인덱스를 재정렬하고 재설정하므로 이를 사용할 수 있습니다. 배열의 숫자 인덱스를 재설정합니다.

0x05 null 값 지우기

嘿,有时候我们想清除某个数组中的空值比如:null、false、0、0.0、[]空数组、''空字符串、'0'字符串0 ,这时 array_filter 函数便能帮上大忙。代码如下:

<?php
$input = [&#39;foo&#39;, false, -1, null, &#39;&#39;, []];
var_dump(array_filter($input));
// 结果 [0 => &#39;foo&#39;, 2 => -1]

为什么会出现这样的结果捏?array_filter 的作用其实是「用回调函数过滤数组中的单元」,它的第二个参数其实是个回调函数,向数组的每个成员都执行这个回调函数,若回调函数的返回值为 true 便保留这个成员,为 false 则忽略。这个函数还有一个特性就是:

如果没有提供 callback 函数, 将删除 array 中所有等值为 FALSE 的条目。

等值为 false 就是转换为 bool 类型后值为 false 的意思,详细看文档:转换为布尔类型。

注意:如果不填写 callback 函数,0、0.0、'0'字符串0 这些可能有意义的值会被删除。所以如果清除的规则有所不同还需要自行编写 callback 函数。

0x06 确认数组成员全部为真

有时候我们希望确认数组中的的值全部为 true,比如:['read' => true, 'write' => true, 'execute' => true],这时我们需要用一个循环判定吗?NO,NO,NO……只需要用 array_product 函数便可以实现了。代码如下:

<?php
$power = [&#39;read&#39; => true, &#39;write&#39; => true, &#39;execute&#39; => true];
var_dump((bool)array_product($power));
// 结果 true
$power = [&#39;read&#39; => true, &#39;write&#39; => true, &#39;execute&#39; => false];
var_dump((bool)array_product($power));
// 结果 false

为什么能实现这个功能呢? array_product 函数本来的功能是「计算数组中所有值的乘积」,在累乘数组中所有成员的时候会将成员的值转为数值类型。当传递的参数为一个 bool 成员所组成的数组时,众所周知 true 会被转为 1,false 会被转为 0。然后只要数组中出现一个 false 累乘的结果自然会变成 0,然后我们再将结果转为 bool 类型不就是 false 了嘛!

注意:使用 array_product 函数将在计算过程中将数组成员转为数值类型进行计算,所以请确保你了解数组成员转为数值类型后的值,否则会产生意料之外的结果。比如:

<?php
$power = [&#39;read&#39; => true, &#39;write&#39; => true, &#39;execute&#39; => &#39;true&#39;];
var_dump((bool)array_product($power));
// 结果 false

上例是因为 'true' 在计算过程中被转为 0。要想详细了解请点击这里。

0x07 获取指定键名之前 / 之后的数组

如果我们只想要关联数组中指定键名值之前的部分该怎么办呢?又用一个循环?当然不用我们可以通过 array_keys、array_search 和 array_slice 组合使用便能够实现!下面贴代码:

<?php
$data = [&#39;first&#39; => 1, &#39;second&#39; => 2, &#39;third&#39; => 3];
function beforeKey($array, $key) {
    $keys = array_keys($array);
      // $keys = [0 => &#39;first&#39;, 1 => &#39;second&#39;, 2 => &#39;third&#39;]
    $len = array_search($key, $keys);
    return array_slice($array, 0, $len);
}
var_dump(beforeKey($data, &#39;first&#39;));
// 结果 []
var_dump(beforeKey($data, &#39;second&#39;));
// 结果 [&#39;first&#39; => 1]
var_dump(beforeKey($data, &#39;third&#39;));
// 结果 [&#39;first&#39; => 1, &#39;second&#39; => 2]

思路解析,要实现这样的功能大部分同学都应该能想到 array_slice 函数,但这个函数取出部分数组是根据偏移量(可以理解为键名在数组中的顺序,从 0 开始)而不是根据键名的,而关联数组的键名却是是字符串或者是不按顺序的数字,此时要解决的问题便是「如何取到键名对应的偏移量?」,这是 array_keys 函数便帮了我们大忙,它的功能是「返回数组中部分的或所有的键名」默认返回全部键名,此外返回的键名数组是以数字索引的,也就是说返回的键名数组的索引就是偏移量!例子中的原数组变为: [0 => 'first', 1 => 'second', 2 => 'third'] 。然后我们通过 array_search 便可以获得指定键名的偏移量了,因为这个函数的功能是「在数组中搜索给定的值,如果成功则返回首个相应的键名」。有了偏移量我们直接调用 array_slice 函数便可以实现目的了。

上面的例子懂了,那获取指定键名之后的数组也就轻而易举了,略微修改 array_slice 即可。直接贴代码:

<?php
$data = [&#39;first&#39; => 1, &#39;second&#39; => 2, &#39;third&#39; => 3];
function afterKey($array, $key) {
    $keys = array_keys($array);
    $offset = array_search($key, $keys);
    return array_slice($array, $offset + 1);
}
var_dump(afterKey($data, &#39;first&#39;));
// 结果 [&#39;second&#39; => 2, &#39;third&#39; => 3]
var_dump(afterKey($data, &#39;second&#39;));
// 结果 [&#39;third&#39; => 3]
var_dump(afterKey($data, &#39;third&#39;));
// 结果 []

那如何获取指定值之前或之后的数组呢?嘿,记得 array_search 的作用吧,其实我们只需要这样调用 beforeKey($data, array_search($value, $data)) 不就实现了嘛!

0x08 数组中重复次数最多的值

敲黑板,划重点!据说这是一道面试题喔。假设有这样一个数组 [6, 11, 11, 2, 4, 4, 11, 6, 7, 4, 2, 11, 8],请问如何获取数组中重复次数最多的值?关键就在于 array_count_values 函数。实例代码如下:

<?php
$data = [6, 11, 11, 2, 4, 4, 11, 6, 7, 4, 2, 11, 8];
$cv = array_count_values($data);
// $cv = [6 => 2, 11 => 4, 2 => 2, 4 => 3, 7 => 1, 8 => 1]
arsort($cv);
$max = key($cv);
var_dump($max);
// 结果 11

array_count_values 函数的功能是「统计数组中所有的值」,就是将原数组中的值作为返回数组的键名,值出现的次数作为返回数组的值。这样我们便可以通过 arsort 函数对出现的次数进行降序排序并且保持索引关联。最后使用 key 获得当前单元(当前单元默认为数组第一个成员)的键名,此时的键名即是原数组的值重复次数最多的值。

0x09 打广告时间

虽然 PHP 提供了很多和数组相关的函数,但使用起来还是不算太方便而且都是通过函数的调用方式而没有面向对象相关的实现,所以我最近在写一个开源的工具类项目 zane/utils,封装了一些常用的方法并且支持链式调用,其中的 Ary 类实现 「获取数组中重复次数最多的值」只需一行,如下所示:

$data = [6, 11, 11, 2, 4, 4, 11, 6, 7, 4, 2, 11, 8];
$max = Ary::new($data)->countValues()->maxKey();
var_dump($max);
// 结果 11

欢迎大家给我提 issue 和 pr,另外如果你喜欢这个项目希望动动小手点个 star。

项目地址:https://github.com/zanemmm/utils

0x0A 结语

其实还有很多实用的函数没有介绍,但是限于文章篇幅就讲到这里了吧。本文出现的很多例子都并非本人原创的,多数出于 PHP 官方手册(每个函数功能下面的评论里都有很多大神提出一些厉害的用法,部分示例就是出自评论)。在下只是拾人牙慧,将其总结了一下。另外文章中若出现错误,希望大家能够指出,若有疑问可以互相讨论。

更多编程相关内容,请关注php中文网编程入门栏目!

위 내용은 PHP 배열 함수를 현명하게 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 segmentfault에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
PHP : 서버 측 스크립팅 언어 소개PHP : 서버 측 스크립팅 언어 소개Apr 16, 2025 am 12:18 AM

PHP는 동적 웹 개발 및 서버 측 응용 프로그램에 사용되는 서버 측 스크립팅 언어입니다. 1.PHP는 편집이 필요하지 않으며 빠른 발전에 적합한 해석 된 언어입니다. 2. PHP 코드는 HTML에 포함되어 웹 페이지를 쉽게 개발할 수 있습니다. 3. PHP는 서버 측 로직을 처리하고 HTML 출력을 생성하며 사용자 상호 작용 및 데이터 처리를 지원합니다. 4. PHP는 데이터베이스와 상호 작용하고 프로세스 양식 제출 및 서버 측 작업을 실행할 수 있습니다.

PHP 및 웹 : 장기적인 영향 탐색PHP 및 웹 : 장기적인 영향 탐색Apr 16, 2025 am 12:17 AM

PHP는 지난 수십 년 동안 네트워크를 형성했으며 웹 개발에서 계속 중요한 역할을 할 것입니다. 1) PHP는 1994 년에 시작되었으며 MySQL과의 원활한 통합으로 인해 개발자에게 최초의 선택이되었습니다. 2) 핵심 기능에는 동적 컨텐츠 생성 및 데이터베이스와의 통합이 포함되며 웹 사이트를 실시간으로 업데이트하고 맞춤형 방식으로 표시 할 수 있습니다. 3) PHP의 광범위한 응용 및 생태계는 장기적인 영향을 미쳤지 만 버전 업데이트 및 보안 문제에 직면 해 있습니다. 4) PHP7의 출시와 같은 최근 몇 년간의 성능 향상을 통해 현대 언어와 경쟁 할 수 있습니다. 5) 앞으로 PHP는 컨테이너화 및 마이크로 서비스와 같은 새로운 도전을 다루어야하지만 유연성과 활발한 커뮤니티로 인해 적응력이 있습니다.

PHP를 사용하는 이유는 무엇입니까? 설명 된 장점과 혜택PHP를 사용하는 이유는 무엇입니까? 설명 된 장점과 혜택Apr 16, 2025 am 12:16 AM

PHP의 핵심 이점에는 학습 용이성, 강력한 웹 개발 지원, 풍부한 라이브러리 및 프레임 워크, 고성능 및 확장 성, 크로스 플랫폼 호환성 및 비용 효율성이 포함됩니다. 1) 배우고 사용하기 쉽고 초보자에게 적합합니다. 2) 웹 서버와 우수한 통합 및 여러 데이터베이스를 지원합니다. 3) Laravel과 같은 강력한 프레임 워크가 있습니다. 4) 최적화를 통해 고성능을 달성 할 수 있습니다. 5) 여러 운영 체제 지원; 6) 개발 비용을 줄이기위한 오픈 소스.

신화를 폭로 : PHP가 실제로 죽은 언어입니까?신화를 폭로 : PHP가 실제로 죽은 언어입니까?Apr 16, 2025 am 12:15 AM

PHP는 죽지 않았습니다. 1) PHP 커뮤니티는 성능 및 보안 문제를 적극적으로 해결하고 PHP7.x는 성능을 향상시킵니다. 2) PHP는 최신 웹 개발에 적합하며 대규모 웹 사이트에서 널리 사용됩니다. 3) PHP는 배우기 쉽고 서버가 잘 수행되지만 유형 시스템은 정적 언어만큼 엄격하지 않습니다. 4) PHP는 컨텐츠 관리 및 전자 상거래 분야에서 여전히 중요하며 생태계는 계속 발전하고 있습니다. 5) Opcache 및 APC를 통해 성능을 최적화하고 OOP 및 설계 패턴을 사용하여 코드 품질을 향상시킵니다.

PHP vs. Python 토론 : 어느 것이 더 낫습니까?PHP vs. Python 토론 : 어느 것이 더 낫습니까?Apr 16, 2025 am 12:03 AM

PHP와 Python에는 고유 한 장점과 단점이 있으며 선택은 프로젝트 요구 사항에 따라 다릅니다. 1) PHP는 웹 개발, 배우기 쉽고 풍부한 커뮤니티 리소스에 적합하지만 구문은 현대적이지 않으며 성능과 보안에주의를 기울여야합니다. 2) Python은 간결한 구문과 배우기 쉬운 데이터 과학 및 기계 학습에 적합하지만 실행 속도 및 메모리 관리에는 병목 현상이 있습니다.

PHP의 목적 : 동적 웹 사이트 구축PHP의 목적 : 동적 웹 사이트 구축Apr 15, 2025 am 12:18 AM

PHP는 동적 웹 사이트를 구축하는 데 사용되며 해당 핵심 기능에는 다음이 포함됩니다. 1. 데이터베이스와 연결하여 동적 컨텐츠를 생성하고 웹 페이지를 실시간으로 생성합니다. 2. 사용자 상호 작용 및 양식 제출을 처리하고 입력을 확인하고 작업에 응답합니다. 3. 개인화 된 경험을 제공하기 위해 세션 및 사용자 인증을 관리합니다. 4. 성능을 최적화하고 모범 사례를 따라 웹 사이트 효율성 및 보안을 개선하십시오.

PHP : 데이터베이스 및 서버 측 로직 처리PHP : 데이터베이스 및 서버 측 로직 처리Apr 15, 2025 am 12:15 AM

PHP는 MySQLI 및 PDO 확장 기능을 사용하여 데이터베이스 작업 및 서버 측 로직 프로세싱에서 상호 작용하고 세션 관리와 같은 기능을 통해 서버 측로 로직을 처리합니다. 1) MySQLI 또는 PDO를 사용하여 데이터베이스에 연결하고 SQL 쿼리를 실행하십시오. 2) 세션 관리 및 기타 기능을 통해 HTTP 요청 및 사용자 상태를 처리합니다. 3) 트랜잭션을 사용하여 데이터베이스 작업의 원자력을 보장하십시오. 4) SQL 주입 방지, 디버깅을 위해 예외 처리 및 폐쇄 연결을 사용하십시오. 5) 인덱싱 및 캐시를 통해 성능을 최적화하고, 읽을 수있는 코드를 작성하고, 오류 처리를 수행하십시오.

PHP에서 SQL 주입을 어떻게 방지합니까? (준비된 진술, pdo)PHP에서 SQL 주입을 어떻게 방지합니까? (준비된 진술, pdo)Apr 15, 2025 am 12:15 AM

PHP에서 전처리 문과 PDO를 사용하면 SQL 주입 공격을 효과적으로 방지 할 수 있습니다. 1) PDO를 사용하여 데이터베이스에 연결하고 오류 모드를 설정하십시오. 2) 준비 방법을 통해 전처리 명세서를 작성하고 자리 표시자를 사용하여 데이터를 전달하고 방법을 실행하십시오. 3) 쿼리 결과를 처리하고 코드의 보안 및 성능을 보장합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경