วิธีตรวจสอบว่ามีคีย์อาร์เรย์หลายอันหรือไม่


87

ฉันมีอาร์เรย์หลายแบบที่จะมี

story & message

หรือเพียงแค่

story

ฉันจะตรวจสอบได้อย่างไรว่าอาร์เรย์มีทั้งเรื่องราวและข้อความหรือไม่ array_key_exists()ค้นหาเฉพาะคีย์เดียวในอาร์เรย์

มีวิธีทำไหม?


2
หากทั้งสองกรณีมี "เรื่องราว" ดูเหมือนว่าคุณต้องตรวจสอบ "ข้อความ" จริงๆ
Wyzard

5
ใช้การarray_intersect_key()เปรียบเทียบอาร์เรย์ของคีย์ที่คุณต้องการตรวจสอบกับอาร์เรย์ที่คุณกำลังตรวจสอบ หากความยาวของเอาต์พุตตรงกับอาร์เรย์ของคีย์ที่จะตรวจสอบแสดงว่ามีทั้งหมดอยู่
Michael Berkowski

Wyzard ฉันมีอาร์เรย์อื่น ๆ ที่มีข้อความ แต่ไม่ใช่เรื่องราว แต่มีคีย์อื่น ๆ ที่อาร์เรย์ที่มีเรื่องราวหรือเรื่องราวและข้อความจะมีเท่านั้น ขอบคุณ
Ryan

คุณสับสนคีย์และค่าที่นี่หรือไม่? อาร์เรย์มีรูปแบบเหมือน["story & message" => "value"]หรือมากกว่า["story & message"]
GordonM

คำตอบ:


72

หากคุณมีเพียง 2 คีย์ที่จะตรวจสอบ (เช่นในคำถามเดิม) อาจเป็นเรื่องง่ายที่จะโทรเพียงarray_key_exists()สองครั้งเพื่อตรวจสอบว่ามีคีย์อยู่

if (array_key_exists("story", $arr) && array_key_exists("message", $arr)) {
    // Both keys exist.
}

อย่างไรก็ตามเห็นได้ชัดว่าสิ่งนี้ไม่สามารถปรับขนาดได้ดีกับคีย์จำนวนมาก ในสถานการณ์นั้นฟังก์ชันที่กำหนดเองจะช่วยได้

function array_keys_exists(array $keys, array $arr) {
   return !array_diff_key(array_flip($keys), $arr);
}

3
หากผู้คนคิดว่าโซลูชันอื่นดีกว่าสำหรับการตรวจสอบว่าอาร์เรย์มีสมาชิกสองคนอยู่หรือไม่พวกเขาจะต้องไม่ชอบโค้ดหรือประสิทธิภาพที่อ่านได้ชัดเจน :)
อเล็กซ์

นี่อาจเป็นวิธีแก้ปัญหาที่ง่ายที่สุดหากคีย์ที่คุณต้องการมีค่อนข้างน้อย ถ้าจะอ่านไม่ออกถ้าเป็น 20 หรือ 30
apokryfos

1
@apokryfos เห็นด้วย แต่มันตอบคำถามของ OP
alex

2
@alex ปัญหาเดียวคือถ้า$keysมีองค์ประกอบหนึ่งที่ไม่ได้อยู่ใน$arrและอีกองค์ประกอบที่อยู่ในนั้นจะ!array_diff_keyส่งกลับค่าว่าง => false( ตัวอย่าง 3v4l ) ...
CPHPython

3
ฉันคิดว่านี้สามารถทำให้อ่านได้มากขึ้นโดยใช้!array_diff($keys, array_keys($array));เพราะมีองค์ความรู้เล็ก ๆ น้อย ๆ น้อยโหลดมีส่วนร่วมในการทำงานออกผู้array_flips
moopet

194

นี่คือวิธีแก้ปัญหาที่ปรับขนาดได้แม้ว่าคุณจะต้องการตรวจสอบคีย์จำนวนมากก็ตาม:

<?php

// The values in this arrays contains the names of the indexes (keys) 
// that should exist in the data array
$required = array('key1', 'key2', 'key3');

$data = array(
    'key1' => 10,
    'key2' => 20,
    'key3' => 30,
    'key4' => 40,
);

if (count(array_intersect_key(array_flip($required), $data)) === count($required)) {
    // All required keys exist!
}

ฉันอยากทราบเหตุผลว่าทำไมสิ่งนี้จึงถูกลดลง .. afaik เร็วกว่าเพราะ array_intersect_key ถูกใช้งานใน C และคุณไม่จำเป็นต้องวนซ้ำ
Erfan

ฉลาดจริงๆทำได้ดี - แม้ว่าจะอ่านยากไปหน่อย
Jon z

ขอบคุณ :) เป็น PHP แปลก ๆ ที่ไม่มีฟังก์ชันในตัวสำหรับทำสิ่งนี้ซึ่งเป็นเรื่องธรรมดา มีตันของผู้ใช้ป้อนข้อมูลการเรียนการตรวจสอบว่าการทำเช่นนี้มี แต่ส่วนใหญ่กรณีการใช้งาน overkill มัน
erfan

12
วิธีแก้ปัญหาที่ชาญฉลาดจริง ๆ แต่มันช้ากว่ามาก (ช้ากว่าประมาณ 50% ในกล่องของฉัน) มากกว่าตรงไปตรงมา: `` $ ok = true; foreach (ต้องใช้ $ เป็น $ field) {if (! array_key_exists ($ field, $ data)) $ ok = false; }
Ozh

@Ozh นอกจากนั้น array_key_exists จะช้ากว่า isset
iautomation

34

เซอร์ไพรส์array_keys_existไม่มีอยู่จริง?! ในระหว่างนี้ที่เว้นช่องว่างไว้เพื่อหานิพจน์บรรทัดเดียวสำหรับงานทั่วไปนี้ ฉันกำลังคิดถึงเชลล์สคริปต์หรือโปรแกรมขนาดเล็กอื่น ๆ

หมายเหตุ: แต่ละโซลูชันต่อไปนี้ใช้[…]ไวยากรณ์การประกาศอาร์เรย์แบบกระชับที่มีอยู่ใน php 5.4+

array_diff + array_keys

if (0 === count(array_diff(['story', 'message', '…'], array_keys($source)))) {
  // all keys found
} else {
  // not all
}

(ปลายหมวกสำหรับKim Stacks )

วิธีนี้สั้นที่สุดที่ฉันพบ array_diff()ส่งคืนอาร์เรย์ของรายการที่มีอยู่ในอาร์กิวเมนต์ 1 ที่ไม่มีอยู่ในอาร์กิวเมนต์ 2 ดังนั้นอาร์เรย์ว่างจึงบ่งชี้ว่าพบคีย์ทั้งหมด ใน php 5.5 คุณสามารถทำให้0 === count(…)เป็นเพียงempty(…).

array_reduce + unset

if (0 === count(array_reduce(array_keys($source), 
    function($in, $key){ unset($in[array_search($key, $in)]); return $in; }, 
    ['story', 'message', '…'])))
{
  // all keys found
} else {
  // not all
}

อ่านยากขึ้นและง่ายต่อการเปลี่ยนแปลง array_reduce()ใช้การเรียกกลับเพื่อวนซ้ำบนอาร์เรย์เพื่อให้ได้ค่า ด้วยการป้อนคีย์ที่เราสนใจใน$initialค่าของ$inแล้วลบคีย์ที่พบในแหล่งที่มาเราคาดว่าจะจบลงด้วย 0 องค์ประกอบหากพบคีย์ทั้งหมด

โครงสร้างนั้นง่ายต่อการปรับเปลี่ยนเนื่องจากปุ่มที่เราสนใจนั้นพอดีกับบรรทัดล่าง

array_filter & in_array

if (2 === count(array_filter(array_keys($source), function($key) { 
        return in_array($key, ['story', 'message']); }
    )))
{
  // all keys found
} else {
  // not all
}

เขียนง่ายกว่าarray_reduceวิธีแก้ปัญหา แต่แก้ไขได้ยากกว่าเล็กน้อย array_filterยังเป็นการเรียกกลับซ้ำที่ช่วยให้คุณสร้างอาร์เรย์ที่กรองแล้วโดยส่งคืนจริง (คัดลอกรายการไปยังอาร์เรย์ใหม่) หรือเท็จ (อย่าคัดลอก) ในการเรียกกลับ gotchya คือคุณต้องเปลี่ยน2เป็นจำนวนรายการที่คุณคาดหวัง

สิ่งนี้สามารถทำให้ทนทานมากขึ้น แต่มีความสามารถในการอ่านได้ล่วงหน้า

$find = ['story', 'message'];
if (count($find) === count(array_filter(array_keys($source), function($key) use ($find) { return in_array($key, $find); })))
{
  // all keys found
} else {
  // not all
}

3
ความแตกต่างจะเล็กน้อยสำหรับชุดเล็ก หากคุณกำลังเขียนไลบรารี / เฟรมเวิร์กที่จัดการกับข้อมูลจำนวนมากคุณควรทดสอบประสิทธิภาพแต่ละหน่วยเพื่อค้นหาคอขวดแทนที่จะปรับให้เหมาะสมก่อนเวลาอันควร
Mark Fox

16

สำหรับฉันแล้วดูเหมือนว่าวิธีการที่ง่ายที่สุดคือ:

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

$values = array(
    'a' => '1',
    'b' => '2'
);

$missing = array_diff_key(array_flip($required), $values);

พิมพ์:

Array(
    [c] => 2
    [d] => 3
)

นอกจากนี้ยังช่วยให้ตรวจสอบว่าคีย์ใดหายไปอย่างแน่นอน สิ่งนี้อาจมีประโยชน์สำหรับการจัดการข้อผิดพลาด


นี่คือสิ่งที่ฉันมาที่นี่!
eNeMetcH

9

อีกวิธีหนึ่งที่เป็นไปได้:

if (!array_diff(['story', 'message'], array_keys($array))) {
    // OK: all the keys are in $array
} else {
   // FAIL: some keys are not
}

7

วิธีแก้ปัญหาข้างต้นฉลาด แต่ช้ามาก foreach loop แบบธรรมดาที่มี isset จะเร็วกว่าarray_intersect_keyโซลูชันมากกว่าสองเท่า

function array_keys_exist($keys, $array){
    foreach($keys as $key){
        if(!array_key_exists($key, $array))return false;
    }
    return true;
}

(344ms เทียบกับ 768ms สำหรับการทำซ้ำ 1000000 ครั้ง)


isset จะส่งคืนเท็จถ้า ['key' => null] และบางครั้งคุณมีอาร์เรย์ที่มีค่า null คุณควรใช้
array_key_exists

ฉันต้องใช้ตรงข้ามที่นี่เนื่องจากการกลับมาก่อนวัยอันควรด้วยfalse( falseแทนที่trueในกรณีนี้) ดังนั้นสิ่งที่เหมาะกับความต้องการของฉันคือความต้องการforeach ($keys as $key) { if (array_key_exists($key, $array)) { return true; }} return false;ของฉันคือถ้ามีanyคีย์ในอาร์เรย์อยู่ในอาร์เรย์อื่น ...
Geoff

1
ฉันจะไม่เรียก +/- 400ms มากกว่าหนึ่งล้านคีย์ "ช้ามาก" แต่ฉันเป็นมนุษย์เท่านั้น!
พันเอกคลิก

3

หากคุณมีสิ่งนี้:

$stuff = array();
$stuff[0] = array('story' => 'A story', 'message' => 'in a bottle');
$stuff[1] = array('story' => 'Foo');

คุณสามารถทำได้ง่ายๆcount():

foreach ($stuff as $value) {
  if (count($value) == 2) {
    // story and message
  } else {
    // only story
  }
}

สิ่งนี้ใช้ได้เฉพาะเมื่อคุณรู้แน่ว่าคุณมีคีย์อาร์เรย์เหล่านี้เท่านั้นและไม่มีอะไรอื่น

การใช้ array_key_exists () รองรับการตรวจสอบทีละคีย์เท่านั้นดังนั้นคุณจะต้องตรวจสอบทั้งสองอย่างแยกกัน:

foreach ($stuff as $value) {
  if (array_key_exists('story', $value) && array_key_exists('message', $value) {
    // story and message
  } else {
    // either one or both keys missing
  }
}

array_key_exists()คืนค่าจริงหากคีย์อยู่ในอาร์เรย์ แต่เป็นฟังก์ชันจริงและต้องพิมพ์จำนวนมาก โครงสร้างภาษาisset()เกือบจะทำเหมือนกันยกเว้นว่าค่าที่ทดสอบเป็น NULL:

foreach ($stuff as $value) {
  if (isset($value['story']) && isset($value['message']) {
    // story and message
  } else {
    // either one or both keys missing
  }
}

นอกจากนี้ isset ยังอนุญาตให้ตรวจสอบตัวแปรหลายตัวพร้อมกัน:

foreach ($stuff as $value) {
  if (isset($value['story'], $value['message']) {
    // story and message
  } else {
    // either one or both keys missing
  }
}

ตอนนี้เพื่อเพิ่มประสิทธิภาพการทดสอบสำหรับสิ่งที่ตั้งค่าไว้คุณควรใช้ "if":

foreach ($stuff as $value) {
  if (isset($value['story']) {
    if (isset($value['message']) {
      // story and message
    } else {
      // only story
    }
  } else {
    // No story - but message not checked
  }
}

3

แล้วสิ่งนี้:

isset($arr['key1'], $arr['key2']) 

คืนค่าจริงเท่านั้นหากทั้งคู่ไม่เป็นโมฆะ

ถ้าเป็น null คีย์จะไม่อยู่ในอาร์เรย์


1
ถ้าค่าของ$arr['key1']หรือ$arr['key2']เป็นnullรหัสจะคีย์ยังคงมีอยู่
Xorifelse

ฉันเขียนแบบทดสอบโปรดดูที่การทดสอบ @Xorifelse และโปรดแก้ไขฉันหากฉันผิด FYI: ตอนนั้นฉันรู้แค่เวอร์ชัน PHP 5.6. * ดังนั้นฉันจึงทำเพื่อมันเท่านั้น
David Dutkovsky

โค้ดนั้นพยายามทำให้สำเร็จคืออะไร? ทำไมคุณไม่ใช้แค่การforeachวนซ้ำ?
Xorifelse

ฉันต้องการเพิ่มการพิสูจน์ว่าissetฟังก์ชันทำงานตามที่ฉันหมายถึง แต่ตอนนี้ฉันรู้แล้วว่าคุณพูดถูกคีย์ยังคงอยู่ในอาร์เรย์ดังนั้นคำตอบของฉันจึงไม่ถูกต้องขอบคุณสำหรับความคิดเห็น ใช่ฉันสามารถใช้มันforeachได้
David Dutkovsky

3

ฉันใช้อะไรแบบนี้ค่อนข้างบ่อย

$wantedKeys = ['story', 'message'];
$hasWantedKeys = count(array_intersect(array_keys($source), $wantedKeys)) > 0

หรือเพื่อค้นหาค่าสำหรับคีย์ที่ต้องการ

$wantedValues = array_intersect_key($source, array_fill_keys($wantedKeys, 1))


1

นี่คือฟังก์ชันที่ฉันเขียนขึ้นเพื่อใช้ในชั้นเรียน

<?php
/**
 * Check the keys of an array against a list of values. Returns true if all values in the list
 is not in the array as a key. Returns false otherwise.
 *
 * @param $array Associative array with keys and values
 * @param $mustHaveKeys Array whose values contain the keys that MUST exist in $array
 * @param &$missingKeys Array. Pass by reference. An array of the missing keys in $array as string values.
 * @return Boolean. Return true only if all the values in $mustHaveKeys appear in $array as keys.
 */
    function checkIfKeysExist($array, $mustHaveKeys, &$missingKeys = array()) {
        // extract the keys of $array as an array
        $keys = array_keys($array);
        // ensure the keys we look for are unique
        $mustHaveKeys = array_unique($mustHaveKeys);
        // $missingKeys = $mustHaveKeys - $keys
        // we expect $missingKeys to be empty if all goes well
        $missingKeys = array_diff($mustHaveKeys, $keys);
        return empty($missingKeys);
    }


$arrayHasStoryAsKey = array('story' => 'some value', 'some other key' => 'some other value');
$arrayHasMessageAsKey = array('message' => 'some value', 'some other key' => 'some other value');
$arrayHasStoryMessageAsKey = array('story' => 'some value', 'message' => 'some value','some other key' => 'some other value');
$arrayHasNone = array('xxx' => 'some value', 'some other key' => 'some other value');

$keys = array('story', 'message');
if (checkIfKeysExist($arrayHasStoryAsKey, $keys)) { // return false
    echo "arrayHasStoryAsKey has all the keys<br />";
} else {
    echo "arrayHasStoryAsKey does NOT have all the keys<br />";
}

if (checkIfKeysExist($arrayHasMessageAsKey, $keys)) { // return false
    echo "arrayHasMessageAsKey has all the keys<br />";
} else {
    echo "arrayHasMessageAsKey does NOT have all the keys<br />";
}

if (checkIfKeysExist($arrayHasStoryMessageAsKey, $keys)) { // return false
    echo "arrayHasStoryMessageAsKey has all the keys<br />";
} else {
    echo "arrayHasStoryMessageAsKey does NOT have all the keys<br />";
}

if (checkIfKeysExist($arrayHasNone, $keys)) { // return false
    echo "arrayHasNone has all the keys<br />";
} else {
    echo "arrayHasNone does NOT have all the keys<br />";
}

ฉันสมมติว่าคุณต้องตรวจสอบหลายคีย์ทั้งหมดที่มีอยู่ในอาร์เรย์ หากคุณกำลังมองหาคีย์อย่างน้อยหนึ่งคีย์ที่ตรงกันโปรดแจ้งให้เราทราบเพื่อให้เราสามารถระบุฟังก์ชันอื่นได้

Codepad ที่นี่http://codepad.viper-7.com/AKVPCH


1
วิธีแก้ปัญหานั้นดี แต่มีอัญมณีหนึ่งบรรทัดที่ดีฝังอยู่:if (0 === count(array_diff(['key1','key2','key3'], array_keys($lookIn)))) { // all keys exist } else { // nope }
Mark Fox

สิ่งที่คุณเขียนเป็นเรื่องจริง ฉันพบว่าฟังก์ชันของฉันอ่านได้ง่ายขึ้นแม้ว่าจะมีรายละเอียดมากก็ตาม แน่นอนฉันอาจเข้าใจผิด ขอบคุณสำหรับความคิดเห็นเกี่ยวกับคำตอบของฉัน ฉันเรียนรู้สิ่งใหม่ ๆ
Kim Stacks

1

หวังว่านี่จะช่วยได้:

function array_keys_exist($searchForKeys = array(), $inArray = array()) {
    $inArrayKeys = array_keys($inArray);
    return count(array_intersect($searchForKeys, $inArrayKeys)) == count($searchForKeys); 
}

1

มันเก่าและอาจจะถูกฝัง แต่นี่เป็นความพยายามของฉัน

ฉันมีปัญหาคล้ายกับ @Ryan ในบางกรณีฉันจำเป็นต้องตรวจสอบว่ามีคีย์อย่างน้อย 1 คีย์ในอาร์เรย์หรือไม่และในบางกรณีจำเป็นต้องมีทั้งหมด

ดังนั้นฉันจึงเขียนฟังก์ชันนี้:

/**
 * A key check of an array of keys
 * @param array $keys_to_check An array of keys to check
 * @param array $array_to_check The array to check against
 * @param bool $strict Checks that all $keys_to_check are in $array_to_check | Default: false
 * @return bool
 */
function array_keys_exist(array $keys_to_check, array $array_to_check, $strict = false) {
    // Results to pass back //
    $results = false;

    // If all keys are expected //
    if ($strict) {
        // Strict check //

        // Keys to check count //
        $ktc = count($keys_to_check);
        // Array to check count //
        $atc = count(array_intersect($keys_to_check, array_keys($array_to_check)));

        // Compare all //
        if ($ktc === $atc) {
            $results = true;
        }
    } else {
        // Loose check - to see if some keys exist //

        // Loop through all keys to check //
        foreach ($keys_to_check as $ktc) {
            // Check if key exists in array to check //
            if (array_key_exists($ktc, $array_to_check)) {
                $results = true;
                // We found at least one, break loop //
                break;
            }
        }
    }

    return $results;
}

นี้เป็นมากขึ้นกว่าที่มีการเขียนหลาย||และ&&บล็อก


0

สิ่งนี้ไม่ได้ผล?

array_key_exists('story', $myarray) && array_key_exists('message', $myarray)

2
ค่าคงที่ไม่สามารถเป็นอาร์เรย์ ... :)
Sven

ฉันมักจะลืม $ เมื่อไม่ได้เขียนในการตรวจสอบรหัสการเติมข้อความอัตโนมัติ IDE ของฉัน =)
กีวี

0
<?php

function check_keys_exists($keys_str = "", $arr = array()){
    $return = false;
    if($keys_str != "" and !empty($arr)){
        $keys = explode(',', $keys_str);
        if(!empty($keys)){
            foreach($keys as $key){
                $return = array_key_exists($key, $arr);
                if($return == false){
                    break;
                }
            }
        }
    }
    return $return;
}

// เรียกใช้การสาธิต

$key = 'a,b,c';
$array = array('a'=>'aaaa','b'=>'ccc','c'=>'eeeee');

var_dump( check_keys_exists($key, $array));

0

ฉันไม่แน่ใจว่ามันเป็นความคิดที่ไม่ดี แต่ฉันใช้ foreach loop ที่เรียบง่ายมากเพื่อตรวจสอบคีย์อาร์เรย์หลายตัว

// get post attachment source url
$image     = wp_get_attachment_image_src(get_post_thumbnail_id($post_id), 'single-post-thumbnail');
// read exif data
$tech_info = exif_read_data($image[0]);

// set require keys
$keys = array('Make', 'Model');

// run loop to add post metas foreach key
foreach ($keys as $key => $value)
{
    if (array_key_exists($value, $tech_info))
    {
        // add/update post meta
        update_post_meta($post_id, MPC_PREFIX . $value, $tech_info[$value]);
    }
} 

0
// sample data
$requiredKeys = ['key1', 'key2', 'key3'];
$arrayToValidate = ['key1' => 1, 'key2' => 2, 'key3' => 3];

function keysExist(array $requiredKeys, array $arrayToValidate) {
    if ($requiredKeys === array_keys($arrayToValidate)) {
        return true;
    }

    return false;
}

0
$myArray = array('key1' => '', 'key2' => '');
$keys = array('key1', 'key2', 'key3');
$keyExists = count(array_intersect($keys, array_keys($myArray)));

จะคืนค่าจริงเนื่องจากมีคีย์จาก $ keys array ใน $ myArray


0

บางอย่างเท่านี้ก็ใช้ได้

//Say given this array
$array_in_use2 = ['hay' => 'come', 'message' => 'no', 'story' => 'yes'];
//This gives either true or false if story and message is there
count(array_intersect(['story', 'message'], array_keys($array_in_use2))) === 2;

สังเกตเครื่องหมายถูกกับ 2 หากค่าที่คุณต้องการค้นหาแตกต่างกันคุณสามารถเปลี่ยนแปลงได้

โซลูชันนี้อาจไม่มีประสิทธิภาพ แต่ได้ผล!

อัปเดต

ในหนึ่งฟังก์ชั่นไขมัน :

 /**
 * Like php array_key_exists, this instead search if (one or more) keys exists in the array
 * @param array $needles - keys to look for in the array
 * @param array $haystack - the <b>Associative</b> array to search
 * @param bool $all - [Optional] if false then checks if some keys are found
 * @return bool true if the needles are found else false. <br>
 * Note: if hastack is multidimentional only the first layer is checked<br>,
 * the needles should <b>not be<b> an associative array else it returns false<br>
 * The array to search must be associative array too else false may be returned
 */
function array_keys_exists($needles, $haystack, $all = true)
{
    $size = count($needles);
    if($all) return count(array_intersect($needles, array_keys($haystack))) === $size;
    return !empty(array_intersect($needles, array_keys($haystack)));

}

ตัวอย่างเช่นนี้:

$array_in_use2 = ['hay' => 'come', 'message' => 'no', 'story' => 'yes'];
//One of them exists --> true
$one_or_more_exists = array_keys_exists(['story', 'message'], $array_in_use2, false);
//all of them exists --> true
$all_exists = array_keys_exists(['story', 'message'], $array_in_use2);

หวังว่านี่จะช่วยได้ :)


0

ฉันมักจะใช้ฟังก์ชันเพื่อตรวจสอบความถูกต้องของโพสต์และเป็นคำตอบสำหรับคำถามนี้ด้วยดังนั้นขออนุญาตโพสต์

เพื่อเรียกใช้ฟังก์ชันของฉันฉันจะใช้อาร์เรย์ 2 ตัวแบบนี้

validatePost(['username', 'password', 'any other field'], $_POST))

จากนั้นฟังก์ชันของฉันจะเป็นแบบนี้

 function validatePost($requiredFields, $post)
    {
        $validation = [];

        foreach($requiredFields as $required => $key)
        {
            if(!array_key_exists($key, $post))
            {
                $validation['required'][] = $key;
            }
        }

        return $validation;
    }

สิ่งนี้จะส่งออกสิ่งนี้

"required": ["username", "password", "any other fields"]

ดังนั้นสิ่งที่ฟังก์ชันนี้ทำคือตรวจสอบความถูกต้องและส่งคืนฟิลด์ที่ขาดหายไปทั้งหมดของคำขอโพสต์


0
    $colsRequired   = ["apple", "orange", "banana", "grapes"];
    $data           = ["apple"=>"some text", "orange"=>"some text"];
    $presentInBoth  = array_intersect($colsRequired,array_keys($data));

    if( count($presentInBoth) != count($colsRequired))
        echo "Missing keys  :" . join(",",array_diff($colsRequired,$presentInBoth));
    else
        echo "All Required cols are present";

ยินดีต้อนรับสู่ stackoverflow คุณช่วยปรับปรุงคำตอบของคุณได้โดยการอธิบายโค้ดเล็กน้อยและอธิบายว่าทำไมโค้ดนี้จึงเป็นโซลูชัน
Max Muster
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.