如何在 PHP 中构建多维数组

问题描述 投票:0回答:3

我正在尝试使用我正在切割的字符串数组在 PHP 中构建一个多维数组,因此 1:[email protected]:7:8.35 的字符串变成

"id": "1",  
"email_address": "[email protected]",  
"domain": "yahoo.com",  
"number_of_orders": "7",    
"total_order_value": "£8.35"

在 JavaScript 中,我会创建一个包含上述值的对象并将其放入数组中,但 PHP 中的等价物是什么? 到目前为止,我有以下代码,它给了我

Array ( [0] => stdClass Object ( [id] => 1 [电子邮件] => [电子邮件受保护] [域名] => yahoo.com [订单数量] => 7 [总订单值] => 8.35)

<?php

$data = file_get_contents('orderdata');
/* echo $data; */

$lines = explode("\n", $data);

array_splice($lines, 0, 8);
/* var_dump($lines); */

array_splice($lines, -3);
/* var_dump($lines); */

/* removes all NULL, FALSE and Empty Strings but leaves 0 (zero) values */
$lines = array_values(array_filter($lines, 'strlen'));


function arraySort($lines ,$i) {
    $rep = new stdClass();
    $rep->id = strId($lines, $i);
    $rep->email = strEmail($lines, $i);
    $rep->domain = strDomain($lines, $i);
    $rep->number_of_orders = orderNo($lines, $i);
    $rep->total_order_value = orderValue($lines, $i);
    /* var_dump($rep); */
    return $rep;
}


function strDomain($lines, $i) {
    if($lines[$i] == null){
        return "";
    } 
    else {
        $str = $lines[$i];
        $splt = explode(':', $str);
        $domain = explode('@', $splt[1]);
        return $domain[1];
    }
}


function strId($lines, $i) {
    if($lines[$i] == null){
        return "";
    } 
    else {
        $str = $lines[$i];
        $splt = explode(':', $str);
        return $splt[0];
    }

}


function strEmail($lines, $i) {
    if($lines[$i] == null){
        return "";
    } 
    else {
        $str = $lines[$i];
        $splt = explode(':', $str);
        return $splt[1];
    }
}


function orderNo($lines, $i) {
    if($lines[$i] == null){
        return "";
    } 
    else {
        $str = $lines[$i];
        $splt = explode(':', $str);
        return $splt[2];
    }
}


function orderValue($lines, $i) {
    if($lines[$i] == null){
        return "";
    } 
    else {
        $str = $lines[$i];
        $splt = explode(':', $str);
        return '£' + $splt[3];
    }
}

$reports = array();
$reps = array();
for($i = 0, $length = count($lines); $i < $length; ++$i) {
    $reps = arraySort($lines, $i);
    array_push($reports, $reps);
}

?>

但是当我尝试用

搜索数组时
$filteredArray = 
array_filter($reports, function($element) use($search){
  return isset($element['domain']) && $element['domain'] == $search;
});

我收到以下错误

致命错误:未捕获错误:无法使用 stdClass 类型的对象作为 phpData.php 中的数组:110 堆栈跟踪:#0 [内部函数]: {closure}(Object(stdClass)) #1 phpData.php(111): array_filter(数组, Object(Closure)) #2 {main} 抛出 phpData.php 第 110 行

这是因为我的 arraySort 函数中使用了

$rep = new stdClass();
吗?如果是的话我应该使用什么?

php arrays multidimensional-array
3个回答
1
投票

最简单、最短的解决方案是:

$value = "1:[email protected]:7:8.35";
$keys = array('id', 'email_address', 'number_of_orders', 'total_order_value');
$fused = array_combine($keys, explode(':', $value));
$fused['domain'] = strDomain($fused['email_address']); //using your "strDomain()" function

它将为您提供所需的数组,但您的订单值中不会有

£
符号。


0
投票

你可以使用这样的对象获取方法:

$filteredArray = 
array_filter($reports, function($element) use($search){
  return isset($element->domain) && $element->domain == $search;
});

0
投票

通过复制域子字符串并在爆炸之前注入分隔符,您可以立即解析文本行并按所需的顺序排列所有关联元素。 演示

$line = '1:[email protected]:7:8.35';
var_export(
    array_combine(
        ['id', 'email_address', 'domain', 'number_of_orders', 'total_order_value'],
        explode(':', preg_replace('#@([^:]*)\K#', ':$1', $line))
    )
);

如果愿意,您可以将数组转换为对象 - 只需在数组有效负载之前附加

(object)
即可。

$reports[] = (object) array_combine(
    ['id', 'email_address', 'domain', 'number_of_orders', 'total_order_value'],
    explode(':', preg_replace('#@([^:]*)\K#', ':$1', $line))
);

替换步骤捕获

@
之后直到下一个冒号之前的子字符串,然后将该子字符串作为新的分隔值重新插入到下一个位置。

附注对于将文本解析为对象的函数来说,

arraySort()
并不是一个理想的名称。 甚至
parseLine()
也会更直观。

© www.soinside.com 2019 - 2024. All rights reserved.