PHP ค้นหาอาร์เรย์หลายมิติตามค่า


332

ฉันมีอาร์เรย์ที่ฉันต้องการค้นหาuidและรับกุญแจของอาร์เรย์

ตัวอย่าง

สมมติว่าเรามีอาร์เรย์ 2 มิติดังต่อไปนี้:

$userdb = array(
    array(
        'uid' => '100',
        'name' => 'Sandra Shush',
        'pic_square' => 'urlof100'
    ),
    array(
        'uid' => '5465',
        'name' => 'Stefanie Mcmohn',
        'pic_square' => 'urlof100'
    ),
    array(
        'uid' => '40489',
        'name' => 'Michael',
        'pic_square' => 'urlof40489'
    )
);

การเรียกฟังก์ชั่นsearch_by_uid(100)(uid ของผู้ใช้คนแรก) 0ควรกลับ

เรียกฟังก์ชันควรกลับsearch_by_uid(40489)2

ฉันพยายามทำลูป แต่ฉันต้องการรหัสที่เร็วขึ้น


น่าสนใจขีดเส้นใต้ (และ lowdash) บรรณารักษ์เพิ่มฟังก์ชั่นนี้เพื่อจาวาสคริปต์ ...
ErichBSchulz

9
ฉันเขียนสคริปต์เพื่อทดสอบประสิทธิภาพของคำตอบสองสามข้อ มันสร้างอาร์เรย์ของสมาชิก 500k และค้นหาค่าในสมาชิกล่าสุด ฉันเปรียบเทียบฟังก์ชันเช่นคำตอบที่ยอมรับกับคำตอบแบบหนึ่งคำตอบสองarray_columnคำตอบ ฉันปรับเปลี่ยนพวกเขาทั้งหมดเพื่อส่งกลับอาร์เรย์ที่ค้นพบจริงไม่ใช่แค่คีย์เพราะโดยปกติแล้วเป็นกรณีการใช้งานของฉัน วิธีการทำงานได้คะแนน 0.361, search-col 0.184 และ keys-col 0.189 การหน่วงเวลาไมโครโดยเฉลี่ยมากกว่า 1,000 ครั้งสำหรับแต่ละวิธี
Josh

คำตอบ:


474
function searchForId($id, $array) {
   foreach ($array as $key => $val) {
       if ($val['uid'] === $id) {
           return $key;
       }
   }
   return null;
}

สิ่งนี้จะได้ผล คุณควรจะเรียกมันว่า:

$id = searchForId('100', $userdb);

มันเป็นสิ่งสำคัญที่จะรู้ว่าถ้าคุณกำลังใช้===ประกอบการเมื่อเทียบกับประเภทจะต้องมีเหมือนกันว่าในตัวอย่างนี้คุณต้องค้นหาstringหรือเพียงแค่ใช้แทน=====

ขึ้นอยู่กับ คำตอบ angoru ใน PHP รุ่นที่ใหม่กว่า (>= 5.5.0) คุณสามารถใช้หนึ่งซับใน

$key = array_search('100', array_column($userdb, 'uid'));

นี่คือเอกสาร: http://php.net/manual/en/function.array-column.php


8
คุณควรจะสามารถทำได้โดยไม่ต้องใช้ PHP 5.5 ในหนึ่งซับโดยใช้ array_map แทน array_column เพียงแทนที่array_column($userdb, 'uid')ด้วยarray_map(function($v){return $v['uid'];},$userdb)
Jesse Green

1
ใช่คุณพูดถูก มีฟังก์ชั่นของ Lambda ตั้งแต่ PHP 5.3 และดีกว่าarray_searchนั้นใช่ไหม
Jakub Truneček

@angoru ฉันคิดว่าโซลูชันดั้งเดิม ( foreachลูป) จะทำงานได้เร็วขึ้นเพราะหยุดทันทีที่พบการแข่งขัน โซลูชันที่ใหม่กว่าจะต้องวนซ้ำทั้งอาร์เรย์หนึ่งครั้งเพื่อแยกarray_columnแล้ววนซ้ำอีกครั้งเพื่อทำการค้นหา (จนกว่าจะพบการจับคู่) โซลูชันที่ใหม่กว่านั้นง่ายต่อการอ่านกระชับมากขึ้น แต่ OP ได้นำเอาประสิทธิภาพมาเป็นปัญหาโดยเฉพาะ
BeetleJuice

@ JakubTruneček ฉันมีบางอย่างที่เกี่ยวข้องกับอาร์เรย์เดียวกันกับคำถาม ฉันต้องการชื่อผู้ใช้จากอาร์เรย์โดยส่งรหัส ฟังก์ชัน findUserName (40489) ควรส่งคืน 'Michael' เป็นไปได้อย่างไร?
Ashok Gujjar

@ JakubTrunečekสวัสดีฉันประสบปัญหานี้ในรหัสของฉัน แต่ฉันมีสิ่งที่แตกต่างกันมาก ในกรณีของฉันค่า 'uid' มีอยู่หลายครั้งดังนั้นฉันต้องได้รับอาร์เรย์ของคีย์ที่ก่อตั้งขึ้น
Bhavin Thummar

314

หากคุณกำลังใช้ (PHP 5> = 5.5.0) คุณไม่จำเป็นต้องเขียนฟังก์ชั่นของคุณเองเพียงแค่เขียนบรรทัดนี้แล้วก็เสร็จ

หากคุณต้องการเพียงผลเดียว:

$key = array_search(40489, array_column($userdb, 'uid'));

สำหรับผลลัพธ์หลายรายการ

$keys = array_keys(array_column($userdb, 'uid'), 40489);

ในกรณีที่คุณมีอาเรย์เชื่อมโยงตามที่ระบุไว้ในความคิดเห็นที่คุณสามารถทำได้ด้วย:

$keys = array_keys(array_combine(array_keys($userdb), array_column($userdb, 'uid')),40489);

หากคุณใช้ PHP <5.5.0 คุณสามารถใช้backport นี้ขอบคุณแรมซีย์!

อัปเดต: ฉันสร้างมาตรฐานง่ายๆและดูเหมือนว่าผลลัพธ์หลายแบบจะเร็วที่สุดเร็วกว่าฟังก์ชั่นที่กำหนดเองของจาคุบ!


จะเกิดอะไรขึ้นถ้าค่าที่ฉันกำลังค้นหา (ในตัวอย่างนี้คือ 40489) ปรากฏมากกว่าหนึ่งครั้งและฉันต้องการได้รับคีย์ทั้งหมดที่ปรากฏ
Dimitris Papageorgiou

หากค่า 40489 ปรากฏขึ้นมากกว่าหนึ่งครั้งในอาร์เรย์ฟังก์ชันจะส่งคืนอาร์เรย์ของคีย์ ... หรือไม่ @angoru
jishan

หากคุณใช้ตัวพิมพ์ที่สองสำหรับผลลัพธ์หลายรายการคุณจะได้รับชุดของคีย์
angoru

2
สิ่งนี้ไม่ได้ผลสำหรับฉันเมื่อคีย์ใน $ userdb ไม่เริ่มต้นเป็น 0,1, 2 ฯลฯ .. และบอกว่าคีย์คือ 1234,4566 ฯลฯ คีย์ผลลัพธ์ที่ได้หลังจาก array_search จะเป็น 0,1,2 เสมอ เมื่อ
Kaushtuv

1
สิ่งนี้จะไม่ทำงานกับอาเรย์แบบเชื่อมโยง แต่คุณสามารถแก้ไขได้ดังนี้: array_search(40489, array_combine(array_keys($userdb), array_column($userdb, 'uid')))
John Mellor

32

ใน PHP รุ่นที่ใหม่กว่า (> = 5.5.0) คุณสามารถใช้หนึ่งบรรทัดต่อไปนี้:

$key = array_search('100', array_column($userdb, 'uid'));

เพียงแค่ใส่ผลลัพธ์ array_column ในตัวแปรเฉพาะที่หลีกเลี่ยงการเรียก array_column สำหรับแต่ละผลลัพธ์ในอาร์เรย์
Maykonn

26

สร้างคำตอบที่ยอดเยี่ยมของยาคุบต่อไปนี้เป็นคำค้นหาทั่วไปที่จะช่วยให้สามารถระบุคีย์ได้ (ไม่ใช่เฉพาะสำหรับ uid):

function searcharray($value, $key, $array) {
   foreach ($array as $k => $val) {
       if ($val[$key] == $value) {
           return $k;
       }
   }
   return null;
}

การใช้งาน: $results = searcharray('searchvalue', searchkey, $array);


สิ่งนี้มีประโยชน์มากฉันรู้สึกว่าฉันกำลังอยู่ในขั้นตอนการแก้ปัญหาโดยใช้วิธีนี้ แต่ฉันยังคงมีปัญหาอยู่ คุณอาจให้ข้อมูลเชิงลึกหรือไม่ คำถามสามารถพบได้ที่นี่: stackoverflow.com/questions/28704644/…
jasenmp

19

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

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

นอกจากนี้ในสถานการณ์ของฉันอาจมีหลายคีย์ที่จะส่งคืนอันเป็นผลมาจากการค้นหาโดยสาขาอื่น ๆ ที่อาจไม่ซ้ำกัน

 /**
     * @param array multidimensional 
     * @param string value to search for, ie a specific field name like name_first
     * @param string associative key to find it in, ie field_name
     * 
     * @return array keys.
     */
     function search_revisions($dataArray, $search_value, $key_to_search) {
        // This function will search the revisions for a certain value
        // related to the associative key you are looking for.
        $keys = array();
        foreach ($dataArray as $key => $cur_value) {
            if ($cur_value[$key_to_search] == $search_value) {
                $keys[] = $key;
            }
        }
        return $keys;
    }

ต่อมาฉันก็ลงเอยด้วยการเขียนสิ่งนี้เพื่อให้ฉันสามารถค้นหาค่าและรหัสเชื่อมโยงอื่นได้ ดังนั้นตัวอย่างแรกของฉันช่วยให้คุณสามารถค้นหาค่าในคีย์การเชื่อมโยงเฉพาะใด ๆ และส่งคืนการแข่งขันทั้งหมด

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

/**
 * @param array multidimensional 
 * @param string $search_value The value to search for, ie a specific 'Taylor'
 * @param string $key_to_search The associative key to find it in, ie first_name
 * @param string $other_matching_key The associative key to find in the matches for employed
 * @param string $other_matching_value The value to find in that matching associative key, ie true
 * 
 * @return array keys, ie all the people with the first name 'Taylor' that are employed.
 */
 function search_revisions($dataArray, $search_value, $key_to_search, $other_matching_value = null, $other_matching_key = null) {
    // This function will search the revisions for a certain value
    // related to the associative key you are looking for.
    $keys = array();
    foreach ($dataArray as $key => $cur_value) {
        if ($cur_value[$key_to_search] == $search_value) {
            if (isset($other_matching_key) && isset($other_matching_value)) {
                if ($cur_value[$other_matching_key] == $other_matching_value) {
                    $keys[] = $key;
                }
            } else {
                // I must keep in mind that some searches may have multiple
                // matches and others would not, so leave it open with no continues.
                $keys[] = $key;
            }
        }
    }
    return $keys;
}

การใช้ฟังก์ชั่น

$data = array(
    array(
        'cust_group' => 6,
        'price' => 13.21,
        'price_qty' => 5
    ),
    array(
        'cust_group' => 8,
        'price' => 15.25,
        'price_qty' => 4
    ),
    array(
        'cust_group' => 8,
        'price' => 12.75,
        'price_qty' => 10
    )
);

$findKey = search_revisions($data,'8', 'cust_group', '10', 'price_qty');
print_r($findKey);

ผลลัพธ์

Array ( [0] => 2 ) 

10

ดูเหมือนarray_filterจะเป็นทางออกที่เหมาะสมสำหรับสิ่งนี้ ...

$userdb=Array
(
    (0) => Array
        (
            (uid) => '100',
            (name) => 'Sandra Shush',
            (url) => 'urlof100'
        ),

    (1) => Array
        (
            (uid) => '5465',
            (name) => 'Stefanie Mcmohn',
            (pic_square) => 'urlof100'
        ),

    (2) => Array
        (
            (uid) => '40489',
            (name) => 'Michael',
            (pic_square) => 'urlof40489'
        )
);

รหัส PHP

<?php 
$search = 5465;
$found = array_filter($userdb,function($v,$k) use ($search){
  return $v['uid'] == $search;
},ARRAY_FILTER_USE_BOTH) // With latest PHP third parameter is mandatory.. Available Values:- ARRAY_FILTER_USE_BOTH OR ARRAY_FILTER_USE_KEY  

$values= print_r(array_value($found)); 
$keys =  print_r(array_keys($found)); 

@BEJAM SHIVA PRASAD คุณช่วยฉันด้วยstackoverflow.com/questions/44721195/…ได้ไหม
Valay

แสดงข้อผิดพลาด:syntax error, unexpected '=>' (T_DOUBLE_ARROW), expecting ';'
Shihas

คุณช่วยกรุณาวางข้อมูลเพิ่มเติมฉันหมายถึงบรรทัดและโครงสร้างรหัสและอาร์เรย์ของคุณ
BEJGAM SHIVA PRASAD

@Shihas ฉันอัปเดตคำตอบแล้วฉันแน่ใจว่าจะได้รับการแก้ไข
BEJGAM SHIVA

9

ผมปรับเปลี่ยนหนึ่งในตัวอย่างด้านล่างคำอธิบายฟังก์ชั่นarray_search ฟังก์ชันsearchItemsByKeyส่งคืนค่าทั้งหมดด้วยปุ่ม $ จากอาร์เรย์หลายมิติ (ระดับ N) บางทีมันอาจจะมีประโยชน์สำหรับใครบางคน ตัวอย่าง:

 $arr = array(
     'XXX'=>array(
               'YYY'=> array(
                    'AAA'=> array(
                          'keyN' =>'value1'
                   )
               ),
              'ZZZ'=> array(
                    'BBB'=> array(
                          'keyN' => 'value2'
                   )
               )
              //.....
           )
);


$result = searchItemsByKey($arr,'keyN');

print '<pre>';
print_r($result);
print '<pre>';
// OUTPUT
Array
(
  [0] => value1
  [1] => value2
)

รหัสฟังก์ชั่น:

function searchItemsByKey($array, $key)
{
   $results = array();

  if (is_array($array))
  {
    if (isset($array[$key]) && key($array)==$key)
        $results[] = $array[$key];

    foreach ($array as $sub_array)
        $results = array_merge($results, searchItemsByKey($sub_array, $key));
  }

 return  $results;
}

7

นี่คือหนึ่งซับสำหรับสิ่งเดียวกัน

$pic_square = $userdb[array_search($uid,array_column($userdb, 'uid'))]['pic_square'];

3

แม้ว่านี่จะเป็นคำถามเก่าและมีคำตอบที่ยอมรับ แต่ฉันคิดว่าฉันขอแนะนำให้เปลี่ยนหนึ่งคำตอบที่ยอมรับได้ดังนั้นก่อนอื่นฉันยอมรับคำตอบที่ถูกต้องแล้วที่นี่

function searchArrayKeyVal($sKey, $id, $array) {
   foreach ($array as $key => $val) {
       if ($val[$sKey] == $id) {
           return $key;
       }
   }
   return false;
}

แทนที่ค่าที่ตั้งไว้ 'uid' ด้วยพารามิเตอร์ในฟังก์ชั่นแทนดังนั้นตอนนี้เรียกรหัสด้านล่างหมายความว่าคุณสามารถใช้ฟังก์ชั่นเดียวในหลายประเภทอาร์เรย์ การเปลี่ยนแปลงเล็กน้อย แต่สิ่งหนึ่งที่สร้างความแตกต่างเล็กน้อย

    // Array Data Of Users
$userdb = array (
    array ('uid' => '100','name' => 'Sandra Shush','url' => 'urlof100' ),
    array ('uid' => '5465','name' => 'Stefanie Mcmohn','url' => 'urlof100' ),
    array ('uid' => '40489','name' => 'Michael','url' => 'urlof40489' ),
);

// Obtain The Key Of The Array
$arrayKey = searchArrayKeyVal("uid", '100', $userdb);
if ($arrayKey!==false) {
    echo "Search Result: ", $userdb[$arrayKey]['name'];
} else {
    echo "Search Result can not be found";
}

ตัวอย่าง PHP Fiddle


อีกเหตุผลที่ฉันใช้ SOF ... ง่ายต่อการ google และค้นหารหัสของตัวเองหรือสิ่งที่ฉันจำได้ .. +1 สำหรับที่เก็บสาธารณะของฉันเอง
Angry 84

BTW, คุณกำลังตั้งผลให้แล้วในรหัสคุณกำลังเปรียบเทียบกับnull false
Taha Paksu

แก้ไขด้วยการคืนค่าเท็จแทน แต่ค่า null อาจดีกว่าหากตรวจสอบบูลีน
Angry 84

3

ฉันต้องการตรวจสอบ tha ในอาร์เรย์ต่อไป$arrนี้มี 'abc' อยู่ในอาร์เรย์ย่อยหรือไม่

$arr = array(
    array(
        'title' => 'abc'
    )
);

จากนั้นฉันสามารถใช้สิ่งนี้

$res = array_search('abc', array_column($arr, 'title'));
if($res == ''){
    echo 'exists';
} else {
    echo 'notExists';
}

ฉันคิดว่านี่เป็นวิธีที่ง่ายที่สุดในการกำหนด


1

ฉันต้องใช้ฟังก์ชั่น un ซึ่งค้นหาองค์ประกอบทั้งหมดในอาร์เรย์ ดังนั้นฉันจึงแก้ไขฟังก์ชั่นที่ทำโดย Jakub Trunečekดังนี้

function search_in_array_r($needle, $array) {
    $found = array();
    foreach ($array as $key => $val) {
        if ($val[1] == $needle) {
            array_push($found, $val[1]);
        }
    }
    if (count($found) != 0)
        return $found;
    else
        return null;
}

1
/**
 * searches a simple as well as multi dimension array
 * @param type $needle
 * @param type $haystack
 * @return boolean
 */
public static function in_array_multi($needle, $haystack){
    $needle = trim($needle);
    if(!is_array($haystack))
        return False;

    foreach($haystack as $key=>$value){
        if(is_array($value)){
            if(self::in_array_multi($needle, $value))
                return True;
            else
               self::in_array_multi($needle, $value);
        }
        else
        if(trim($value) === trim($needle)){//visibility fix//
            error_log("$value === $needle setting visibility to 1 hidden");
            return True;
        }
    }

    return False;
}

1

คุณสามารถใช้ฟังก์ชั่นนี้ https://github.com/serhatozles/ArrayAdvancedSearch

<?php 
include('ArraySearch.php');

$query = "a='Example World' and b>='2'";

$Array = array(
'a' => array('d' => '2'),
array('a' => 'Example World','b' => '2'),
array('c' => '3'), array('d' => '4'),
);

$Result = ArraySearch($Array,$query,1);

echo '<pre>';
print_r($Result);
echo '</pre>'; 

// Output:
// Array
// (
//    [0] => Array
//        (
//            [a] => Example World
//            [b] => 2
//        )
//
// )

1
$a = ['x' => ['eee', 'ccc'], 'b' => ['zzz']];

$found = null;
$search = 'eee';

array_walk($a, function ($k, $v) use ($search, &$found) {
    if (in_array($search, $k)) {
        $found = $v;
    }
});

var_dump($found);

1

ลองสิ่งนี้

<?php
 function recursive_array_search($needle,$haystack) {
    foreach($haystack as $key=>$value) {
        $current_key=$key;
        if($needle===$value OR (is_array($value) && 
            recursive_array_search($needle,$value) !== false)) {
             return $current_key;
        }
    }
    return false;
 }
 ?>

1

แค่แบ่งปันก็อาจจะเป็นแบบนี้

if( ! function_exists('arraySearchMulti')){
function arraySearchMulti($search,$key,$array,$returnKey=false)
{
    foreach ($array as $k => $val) {
        if (isset($val[$key])) {
            if ((string)$val[$key] == (string)$search) {
                return ($returnKey ? $k : $val);
            }
        }else{
            return (is_array($val) ? arraySearchMulti($search,$key,$val,$returnKey) : null);
        }
    }
    return null;
}}

0

ลองสิ่งนี้ด้วย

function search_in_array($srchvalue, $array)
{
    if (is_array($array) && count($array) > 0)
    {
        $foundkey = array_search($srchvalue, $array);
        if ($foundkey === FALSE)
        {
            foreach ($array as $key => $value)
            {
                if (is_array($value) && count($value) > 0)
                {
                    $foundkey = search_in_array($srchvalue, $value);
                    if ($foundkey != FALSE)
                        return $foundkey;
                }
            }
        }
        else
            return $foundkey;
    }
}

0
for( $i =0; $i < sizeof($allUsers); $i++)
    {   
    $NEEDLE1='firstname';
    $NEEDLE2='emailAddress';
    $sterm='Tofind';
     if(isset($allUsers[$i][$NEEDLE1]) && isset($allUsers[$i][$NEEDLE2])
        {
            $Fname= $allUsers[$i][$NEEDLE1];
            $Lname= $allUsers[$i][$NEEDLE2];

            $pos1 = stripos($Fname, $sterm);
            $pos2=stripos($Lname, $sterm);//not case sensitive 

            if($pos1 !== false ||$pos2 !== false)
            {$resultsMatched[] =$allUsers[$i];}
            else
            {   continue;}              
        }

}
Print_r($resultsMatched); //will give array for matched values even partially matched

ด้วยความช่วยเหลือของรหัสข้างต้นหนึ่งสามารถค้นหาข้อมูลใด ๆ (จับคู่บางส่วน) จากคอลัมน์ใด ๆ ในอาร์เรย์ 2 มิติเพื่อให้ ID ผู้ใช้สามารถพบได้ตามที่ต้องการในคำถาม


โปรดเพิ่มวลีเพื่ออธิบายว่าทำไมสิ่งนี้ถึงตอบคำถาม
Lorenz Meyer

ความช่วยเหลือเล็กน้อยของโค้ดข้างต้นหนึ่งสามารถค้นหาข้อมูลใด ๆ (จับคู่บางส่วน) จากคอลัมน์ใด ๆ ในอาร์เรย์ 2 มิติดังนั้น ID ผู้ใช้สามารถพบได้ตามที่ต้องการในคำถาม
sandeep sharma

0

การขยายฟังก์ชั่น @mayhem ที่สร้างขึ้นตัวอย่างนี้จะเป็นการค้นหาแบบ "คลุมเครือ" มากขึ้นในกรณีที่คุณต้องการจับคู่ส่วน ( ส่วนใหญ่ ) ของสตริงการค้นหา:

 function searchArrayKeyVal($sKey, $id, $array) {
    foreach ($array as $key => $val) {
        if (strpos(strtolower($val[$sKey]), strtolower(trim($id))) !== false) {
            return $key;
        }
    }
         return false;
 }

ตัวอย่างเช่นค่าในอาร์เรย์คือยินดีต้อนรับสู่นิวยอร์ก! และคุณต้องการตัวอย่างแรกของ "นิวยอร์ก!"


0
$search1 = 'demo';
$search2 = 'bob';
$arr = array('0' => 'hello','1' => 'test','2' => 'john','3' => array('0' => 'martin', '1' => 'bob'),'4' => 'demo');
foreach ($arr as $value) { 
    if (is_array($value)) { 
        if (in_array($search2, $value)) { 
            echo "successsfully";    
            //execute your code 
        }
    } else {  
        if ($value == $search1) { 
            echo "success";
        }
    }
 }

0

หากคำถามคือ

$a = [
     [
       "_id" => "5a96933414d48831a41901f2",
       "discount_amount" => 3.29,
       "discount_id" => "5a92656a14d488570c2c44a2",
     ],
     [
       "_id" => "5a9790fd14d48879cf16a9e8",
       "discount_amount" => 4.53,
       "discount_id" => "5a9265b914d488548513b122",
     ],
     [
       "_id" => "5a98083614d488191304b6c3",
       "discount_amount" => 15.24,
       "discount_id" => "5a92806a14d48858ff5c2ec3",
     ],
     [
       "_id" => "5a982a4914d48824721eafe3",
       "discount_amount" => 45.74,
       "discount_id" => "5a928ce414d488609e73b443",
     ],
    [
       "_id" => "5a982a4914d48824721eafe55",
       "discount_amount" => 10.26,
       "discount_id" => "5a928ce414d488609e73b443",
     ],
   ];

ตอบ:

function searchForId($id, $array) {
    $did=0;
    $dia=0;
   foreach ($array as $key => $val) {
       if ($val['discount_id'] === $id) {
           $dia +=$val['discount_amount'];
           $did++;
       }
   }
    if($dia != '') {
        echo $dia;
        var_dump($did);
    }
   return null;
};
print_r(searchForId('5a928ce414d488609e73b443',$a));

0

ทางออกของฉัน:

function searchArrayForField($array, $field, $value) {
    $i = 0;
    foreach ($array as &$row) {
        if ($row[$field] === $value) {
            return $i;
        }
        $i++
    }
    return '';
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.