Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中创建基于值的数组?_Php_Arrays - Fatal编程技术网

如何在PHP中创建基于值的数组?

如何在PHP中创建基于值的数组?,php,arrays,Php,Arrays,我有一个这样的数组 Array ( [0] => 123_dr_for_ma_on_2352015_2nd Shift_(08-29-2015_11-31).pdf [1] => 123_dr_for_ma_on_2352015_2nd Shift_(08-29-2015_11-30).pdf [2] => 123_bms_for__on__(10-06-2015_18-36).pdf ) 我想根据它的值将其转换为多维数组,例如 作为 基于第一个下

我有一个这样的数组

  Array
(
    [0] => 123_dr_for_ma_on_2352015_2nd Shift_(08-29-2015_11-31).pdf
    [1] => 123_dr_for_ma_on_2352015_2nd Shift_(08-29-2015_11-30).pdf
    [2] => 123_bms_for__on__(10-06-2015_18-36).pdf
)
我想根据它的值将其转换为多维数组,例如 作为


基于第一个下划线(bms、dr)后面的名称,如。。。。。。。请帮助我实现这一目标

我将执行以下操作:

$newArray = array();
foreach ($array as $key => $value) {
    $parts = explode('_', $value);
    $newArray[$parts[1]][] = $value;
}

print_r($newArray); 

请根据您的要求查找以下代码

<?php
$array = array(
    '0'=>'123_dr_for_ma_on_2352015_2nd Shift_(08-29-2015_11-31).pdf',
    '1'=>'123_dr_for_ma_on_2352015_2nd Shift_(08-29-2015_11-30).pdf',
    '2'=>'123_bms_for__on__(10-06-2015_18-36).pdf'
);

$dr_array = array();
$bms_array = array();
foreach($array as $val){
    $str_explode = explode("_",$val);

    if($str_explode[1]=="dr"){
        $dr_array[] = $val;
    }
    else if($str_explode[1]=="bms"){
        $bms_array[] = $val;
    }
}
var_dump($dr_array);
var_dump($bms_array);
?>
谢谢。

$basicArray=array()//它存储所有元素
$basicArray = array(); //It Stores All The Elements
$firstArray = array(); //It will store array elements of first type
$secondArray = array(); //It will store array elements of second type
for($i = 0; $i < count($basicArray); $i++)
{
    $elementArray = explode("_", $basicArray[i]);
    if($elementArray[1] == "dr")
        array_push($firstArray, $basicArray[i]);
    else if($elementArray[1] == "bms")
        array_push($secondArray, $basicArray[i]);
}
$finalArray = array(); 
array_push($finalArray, $firstArray, $secondArray);
$firstArray=array()//它将存储第一种类型的数组元素 $secondArray=array()//它将存储第二种类型的数组元素 对于($i=0;$i
要解决这个问题,不需要循环,最好将函数与内置阵列过滤器函数一起使用

这里有另一个可能的解决方案——我想这似乎有点酷

<?php

// ####################
// GLOBAL VARIABLES DEFINITION    
// ####################
// Store Pattern Here = Used to Define Array at the end
global $Array_IDs; 
$Array_IDs = array();
// Store Variables With Header Pattern (ID) in this area
global $Array_Values; 
$Array_Values = array();

// ####################
// FUNCTION DEFINITION
// ####################
// FUNCTION TO SPLIT ARRAY
function Get_ID($variable){
    // ACCESS GLOBALS
    global $Array_IDs; 
    global $Array_Values; 

    // GET CURRENT VARIBALE - EXPLODE TO EXTRACT PATTERN AS ID
    $Temp_Parts = explode("_", $variable);

    // CHECK IF IDENTIFIER IS ALREADY FOUND (STORED IN ARRAY_ID)
    if (in_array($Temp_Parts[1], $Array_IDs)){
        // ID ALREADY HAS SUB-ARRAY CREATED
        // JUST APPEND VARIABLE
        $Array_Values[$Temp_Parts[1]][] = $variable;
    }else{
        // ADD ID TO Array_IDs
        $Array_IDs[] = $Temp_Parts[1];
        // Create New ARRAY with HEADER AS PATTERN - ID
        $Array_Values[$Temp_Parts[1]][] = $variable;
    }
}

// ####################
// CODE STARTS HERE == ONLY THREE LINES ;)
// ####################
$Start_Array = array('123_dr_for_ma_on_2352015_2nd Shift_(08-29-2015_11-31).pdf','123_dr_for_ma_on_2352015_2nd Shift_(08-29-2015_11-30).pdf','123_bms_for__on__(10-06-2015_18-36).pdf');
array_filter($Start_Array,"Get_ID");
print_r($Array_Values);

?>

您可以使用
array\u reduce
函数和正则表达式匹配,以获得优雅而简洁的代码

$array = array(
    '0'=>'123_dr_for_ma_on_2352015_2nd Shift_(08-29-2015_11-31).pdf',
    '1'=>'123_dr_for_ma_on_2352015_2nd Shift_(08-29-2015_11-30).pdf',
    '2'=>'123_bms_for__on__(10-06-2015_18-36).pdf'
);

$result = array_reduce($array, function($prod, $current){
    preg_match('/(?<=^123_)\w+(?=_for\w+)/',$current,$match);
    $prod[$match[0]][] = $current;
    return $prod;
}, []);

使用上面的方括号要求PHP 5.4,您可以用
array()
替换PHP的较低版本。

模式将始终相同?不仅是bms和dr。。。。。为什么需要两个阵列?OP说dr bms etc可以扩展到任何东西,你想继续扩展if语句吗?OP说dr bms etc可以是任何东西。
<?php

// ####################
// GLOBAL VARIABLES DEFINITION    
// ####################
// Store Pattern Here = Used to Define Array at the end
global $Array_IDs; 
$Array_IDs = array();
// Store Variables With Header Pattern (ID) in this area
global $Array_Values; 
$Array_Values = array();

// ####################
// FUNCTION DEFINITION
// ####################
// FUNCTION TO SPLIT ARRAY
function Get_ID($variable){
    // ACCESS GLOBALS
    global $Array_IDs; 
    global $Array_Values; 

    // GET CURRENT VARIBALE - EXPLODE TO EXTRACT PATTERN AS ID
    $Temp_Parts = explode("_", $variable);

    // CHECK IF IDENTIFIER IS ALREADY FOUND (STORED IN ARRAY_ID)
    if (in_array($Temp_Parts[1], $Array_IDs)){
        // ID ALREADY HAS SUB-ARRAY CREATED
        // JUST APPEND VARIABLE
        $Array_Values[$Temp_Parts[1]][] = $variable;
    }else{
        // ADD ID TO Array_IDs
        $Array_IDs[] = $Temp_Parts[1];
        // Create New ARRAY with HEADER AS PATTERN - ID
        $Array_Values[$Temp_Parts[1]][] = $variable;
    }
}

// ####################
// CODE STARTS HERE == ONLY THREE LINES ;)
// ####################
$Start_Array = array('123_dr_for_ma_on_2352015_2nd Shift_(08-29-2015_11-31).pdf','123_dr_for_ma_on_2352015_2nd Shift_(08-29-2015_11-30).pdf','123_bms_for__on__(10-06-2015_18-36).pdf');
array_filter($Start_Array,"Get_ID");
print_r($Array_Values);

?>
$array = array(
    '0'=>'123_dr_for_ma_on_2352015_2nd Shift_(08-29-2015_11-31).pdf',
    '1'=>'123_dr_for_ma_on_2352015_2nd Shift_(08-29-2015_11-30).pdf',
    '2'=>'123_bms_for__on__(10-06-2015_18-36).pdf'
);

$result = array_reduce($array, function($prod, $current){
    preg_match('/(?<=^123_)\w+(?=_for\w+)/',$current,$match);
    $prod[$match[0]][] = $current;
    return $prod;
}, []);
array(2) {
  [0]=>
  string(57) "123_dr_for_ma_on_2352015_2nd Shift_(08-29-2015_11-31).pdf"
  [1]=>
  string(57) "123_dr_for_ma_on_2352015_2nd Shift_(08-29-2015_11-30).pdf"
}
array(1) {
  [0]=>
  string(39) "123_bms_for__on__(10-06-2015_18-36).pdf"
}